[Xfce4-commits] [www/bugzilla.xfce.org] 01/01: Initial push for the Xfce Bugzilla skin and related templates.
noreply at xfce.org
noreply at xfce.org
Sun May 28 21:36:10 CEST 2017
This is an automated email from the git hooks/post-receive script.
knome pushed a commit to branch master
in repository www/bugzilla.xfce.org.
commit d16fbe2a4e04fad3d53955aa388ae470b8affb59
Author: Pasi Lallinaho <pasi at shimmerproject.org>
Date: Sun May 28 22:35:11 2017 +0300
Initial push for the Xfce Bugzilla skin and related templates.
---
skins/contrib/Xfce/README | 18 +
skins/contrib/Xfce/add-attachment.png | Bin 0 -> 469 bytes
skins/contrib/Xfce/admin.css | 0
skins/contrib/Xfce/bug.css | 303 +++++
skins/contrib/Xfce/buglist.css | 4 +
skins/contrib/Xfce/favicon.ico | Bin 0 -> 1082 bytes
skins/contrib/Xfce/global.css | 596 ++++++++++
skins/contrib/Xfce/index/bugzilla-magnifier.png | Bin 0 -> 7491 bytes
skins/contrib/Xfce/index/bugzilla-papericon.png | Bin 0 -> 3800 bytes
.../Xfce/index/bugzilla-person-alternate.png | Bin 0 -> 8359 bytes
.../contrib/Xfce/index/bugzilla-questionmark2.png | Bin 0 -> 11552 bytes
skins/contrib/Xfce/rss.png | Bin 0 -> 679 bytes
skins/contrib/Xfce/scripts.js | 9 +
template/en/custom/attachment/list.html.tmpl | 5 +
.../en/custom/attachment/list_DEFAULT.html.tmpl | 1 +
template/en/custom/attachment/list_XFCE.html.tmpl | 157 +++
template/en/custom/bug/comments.html.tmpl | 5 +
template/en/custom/bug/comments_DEFAULT.html.tmpl | 1 +
template/en/custom/bug/comments_XFCE.html.tmpl | 224 ++++
template/en/custom/bug/create/create.html.tmpl | 5 +
.../en/custom/bug/create/create_DEFAULT.html.tmpl | 1 +
.../en/custom/bug/create/create_XFCE.html.tmpl | 619 ++++++++++
template/en/custom/bug/edit.html.tmpl | 5 +
template/en/custom/bug/edit_DEFAULT.html.tmpl | 1 +
template/en/custom/bug/edit_XFCE.html.tmpl | 1183 ++++++++++++++++++++
template/en/custom/bug/field.html.tmpl | 5 +
template/en/custom/bug/field_DEFAULT.html.tmpl | 1 +
template/en/custom/bug/field_XFCE.html.tmpl | 294 +++++
template/en/custom/bug/knob.html.tmpl | 5 +
template/en/custom/bug/knob_DEFAULT.html.tmpl | 1 +
template/en/custom/bug/knob_XFCE.html.tmpl | 103 ++
template/en/custom/bug/navigate.html.tmpl | 5 +
template/en/custom/bug/navigate_DEFAULT.html.tmpl | 1 +
template/en/custom/bug/navigate_XFCE.html.tmpl | 66 ++
template/en/custom/bug/show.html.tmpl | 5 +
template/en/custom/bug/show_DEFAULT.html.tmpl | 1 +
template/en/custom/bug/show_XFCE.html.tmpl | 30 +
template/en/custom/global/banner.html.tmpl | 29 +
template/en/custom/global/choose-product.html.tmpl | 5 +
.../custom/global/choose-product_DEFAULT.html.tmpl | 1 +
.../en/custom/global/choose-product_XFCE.html.tmpl | 73 ++
template/en/custom/global/common-links.html.tmpl | 5 +
.../custom/global/common-links_DEFAULT.html.tmpl | 1 +
.../en/custom/global/common-links_XFCE.html.tmpl | 110 ++
template/en/custom/global/footer.html.tmpl | 5 +
template/en/custom/global/footer_DEFAULT.html.tmpl | 1 +
template/en/custom/global/footer_XFCE.html.tmpl | 11 +
template/en/custom/global/header.html.tmpl | 285 +++++
template/en/custom/global/useful-links.html.tmpl | 5 +
.../custom/global/useful-links_DEFAULT.html.tmpl | 1 +
.../en/custom/global/useful-links_XFCE.html.tmpl | 57 +
template/en/custom/index.html.tmpl | 163 +++
template/en/custom/list/list.html.tmpl | 5 +
template/en/custom/list/list_DEFAULT.html.tmpl | 349 ++++++
template/en/custom/list/list_XFCE.html.tmpl | 328 ++++++
template/en/custom/list/table.html.tmpl | 267 +++++
56 files changed, 5355 insertions(+)
diff --git a/skins/contrib/Xfce/README b/skins/contrib/Xfce/README
new file mode 100644
index 0000000..394f86c
--- /dev/null
+++ b/skins/contrib/Xfce/README
@@ -0,0 +1,18 @@
+This skin is not only a customization layer for CSS; it also includes some
+templates specific to it. These templates create three new files under
+template/en/custom:
+ - templatename.html.tmpl, which executes a simple IF
+ - templatename_DEFAULT.html.tmpl, which is a symlink back to the
+ appropriate default template
+ - templatename_XFCE.html.tmpl, which includes all of the Xfce skin changes
+
+Note: There are a few custom templates that are used to override templates
+for all themes in the Xfce Bugzilla. These are:
+ - index.html.tmpl
+ - global/banner.html.tmpl
+ - global/header.html.tmpl
+ - list/table.html.tmpl
+
+In addition to the CSS files and templates, this skin includes a JavaScript
+file, which is included in the global/header.html.tmpl file; please make
+sure this is kept included when you modify the header template.
diff --git a/skins/contrib/Xfce/add-attachment.png b/skins/contrib/Xfce/add-attachment.png
new file mode 100644
index 0000000..a493b21
Binary files /dev/null and b/skins/contrib/Xfce/add-attachment.png differ
diff --git a/skins/contrib/Xfce/admin.css b/skins/contrib/Xfce/admin.css
new file mode 100644
index 0000000..e69de29
diff --git a/skins/contrib/Xfce/bug.css b/skins/contrib/Xfce/bug.css
new file mode 100644
index 0000000..0792c32
--- /dev/null
+++ b/skins/contrib/Xfce/bug.css
@@ -0,0 +1,303 @@
+/*
+ * BUG VIEW
+ *
+ */
+
+#bug-header {
+ display: flex;
+ padding: 1em 0 0.4em 0;
+ font-weight: normal;
+
+ border-bottom: 1px solid rgba( 0, 0, 0, 0.4 );
+ border-bottom: 1px solid #06c;
+}
+ #bug-header #bug-primary-actions { flex: 2; text-align: right; min-width: 200px; }
+ #bug-header #bug-primary-actions .action-link {
+ font-size: 105%;
+ padding: 0.3em 1em;
+ }
+#bug-title { font-size: 180%; flex: 8; padding-bottom: 0.2em; line-height: 1.1em; }
+ #bug-title a { color: #000; }
+ #bug-title input { display: block; font-size: 80%; margin-top: -0.15em; font-weight: normal; }
+
+/* Main layout
+ */
+
+#bug-layout {
+ display: flex;
+}
+ #bug-main { flex: 70; }
+ #bug-sidebar { flex: 30; margin-left: 3em; min-width: 310px; }
+ #bug-sidebar .field,
+ #bug-sidebar .sidebar-item { margin-bottom: 1em; }
+ #bug-sidebar #sidebar-expand .field,
+ #bug-sidebar #sidebar-expand .sidebar-item { display: none; }
+ #bug-sidebar #sidebar-expand.expanded .field,
+ #bug-sidebar #sidebar-expand.expanded .sidebar-item { display: block; }
+
+ #bug-layout h3 { font-weight: normal; font-size: 130%; border-bottom: 1px solid rgba( 0, 0, 0, 0.3 ); padding-bottom: 0.3em; color: rgba( 0, 0, 0, 0.7 ); margin-top: 2em; }
+ #bug-layout h3:first-child { margin-top: 0.5em; }
+
+/* Rows that need to be split
+ */
+
+#changeform .flex-split { display: flex; }
+#changeform .flex-split * { flex: 1; margin: 0 0.1em; }
+ #changeform .flex-split a.action-link { padding: 0.5em; text-align: center; }
+
+/* Product and component box
+ */
+
+#changeform .flex-item { flex: 2; }
+#changeform .flex-product,
+#changeform .flex-status { flex: 3; }
+#changeform .flex-component { flex: 4; }
+
+#changeform .flex-split span.select,
+#changeform .flex-split select { flex: 2; }
+
+/* Comments
+ */
+
+/* Collapse and Expand links */
+.bz_collapse_expand_comments {
+ float: right;
+ margin-top: -3.5em;
+}
+ .bz_collapse_expand_comments li {
+ display: inline;
+ }
+
+/* Comments itself */
+body #comments pre.bz_comment_text,
+body #comments pre.bz_comment_text * {
+ font-family: 'Noto Sans', sans-serif !important;
+}
+
+/* SIDEBAR
+ */
+
+#bug-sidebar select {
+ width: 100%;
+ margin: 0.2em 0;
+}
+
+/* Duplicates
+ */
+
+.field-duplicates ul {
+ list-style-type: none;
+ margin: 0 0 1em 0;
+ padding-left: 0;
+}
+/* CC List
+ */
+
+#cc_edit_area {
+ margin-left: 2em;
+}
+
+/* Attachments
+ */
+
+#attachment_table {
+ width: 100%;
+ border: none;
+ margin-top: 1em;
+}
+
+#attachment_table tr:nth-child(even) {
+ background-color: rgba( 0, 0, 0, 0.08 );
+}
+#attachment_table tr:nth-child(odd) {
+ background-color: rgba( 0, 0, 0, 0.04 );
+}
+#attachment_table th,
+#attachment_table tr:last-child {
+ background-color: transparent;
+}
+
+#attachment_table td {
+ border: none;
+}
+
+#attachment_table .bz_attach_footer > td > a {
+ display: block;
+ clear: both;
+ background: transparent url(add-attachment.png) no-repeat 0 0;
+ padding-left: 20px;
+}
+
+/*
+ *
+ *
+ */
+
+/* Bug comments */
+.bz_comment_table {
+ width: 100% !important;
+}
+ .bz_comment {
+ background-color: #f3f3f3;
+ margin-bottom: 1em;
+ }
+ .bz_first_comment_head,
+ .bz_comment_head {
+ padding: 0.5em;
+ }
+ .bz_comment_user {
+ font-weight: bold;
+ }
+ .bz_comment_text {
+ width: auto !important;
+ padding: 0 1em 1em 1em;
+ }
+.comment_tab {
+ display: inline-block;
+ margin: 0.1em 0 0.4em 0;
+ font-size: 90%;
+}
+
+#add_comment,
+#add_comment table,
+#add_comment #comment {
+ width: 100%;
+}
+
+/* Commit buttons */
+#commit_top,
+#commit {
+ padding: 0.3em 1em;
+ background-color: #06c;
+ color: #fff;
+}
+ #commit_top:hover, #commit_top:active, #commit_top:focus,
+ #commit:hover, #commit:active, #commit:focus {
+ background-color: #00a8dd;
+ }
+
+/*
+ * Filing and editing bugs
+ *
+ */
+.bug-row,
+.filebug-row {
+ margin-bottom: 1em;
+ width: auto !important;
+ vertical-align: top;
+}
+ /* Bug row elements */
+ .filebug-row b.required::before {
+ color: red;
+ content: "* ";
+ }
+ .flex-item.expert_fields b::before,
+ tbody.expert_fields th::before,
+ #expert_fields_controller::before {
+ color: rgba( 255, 180, 0, 1 );
+ content: "^ ";
+ font-weight: bold;
+ }
+ .bug-row textarea,
+ .filebug-row textarea {
+ width: 100%;
+ }
+ .bug-row input,
+ .bug-row span {
+ vertical-align: top;
+ }
+ /* Specific element styles */
+ .bug-row #short_desc,
+ .filebug-row #short_desc {
+ font-size: 130%;
+ font-weight: 500;
+ padding: 0.5em;
+ }
+ .bug-row #status {
+ margin-bottom: 0;
+ }
+ .bug-row .popup,
+ .filebug-row .popup {
+ padding: 1em;
+ margin-top: 0.3em;
+ background-color: #eee;
+ }
+ /* Possible duplicates table */
+ #possible_duplicates table,
+ #possible_duplicates table th,
+ #possible_duplicates table td {
+ border: none;
+ text-align: left;
+ }
+ #possible_duplicates table th#yui-dt0-th-id {
+ width: 100px;
+ }
+ #possible_duplicates table thead tr {
+ background-color: #ddd !important;
+ }
+ #possible_duplicates table tr:nth-child(odd) {
+ background-color: #f7f7f7;
+ }
+ #possible_duplicates table tr:nth-child(even) {
+ background-color: #eee;
+ }
+
+ /* Flex rows */
+ .bug-row.bug-flex,
+ .filebug-row.filebug-flex {
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 -0.1em;
+ }
+ .bug-row.bug-flex {
+ background-color: #f7f7f7;
+ padding: 0.5em 1em 1em 1em;
+ margin-bottom: 1em !important;
+ }
+ /* Flex items */
+ .bug-row.bug-flex .flex-item,
+ .filebug-row.filebug-flex .flex-item {
+ flex: 1;
+ min-width: 120px;
+ margin: 0 0.1em;
+ line-height: 1.8em;
+ }
+ /* Flex item elements and specific element styles */
+ .bug-row.bug-flex .flex-item select,
+ .filebug-row.filebug-flex .flex-item select {
+ width: 100%;
+ }
+ .bug-row.bug-flex .flex-item.status select#resolution,
+ .bug-row.bug-flex .flex-item.platform select {
+ width: 49%;
+ }
+
+/* Notes... Move to global.css? */
+
+.note {
+ background-color: #eee;
+ padding: 0.5em 0.8em;
+}
+.note-before {
+ border-left: 7px solid rgba( 220, 0, 0, 1 );
+}
+.note-guess-os {
+ border-left: 7px solid rgba( 0, 220, 0, 1 );
+}
+
+/* ... */
+
+.enter_bug_form hr {
+ margin: 1.5em 0;
+ border: none;
+ border-bottom: 3px solid rgba( 0, 0, 0, 0.2 );
+}
+
+
+.bug-row #newalias {
+ margin-top: -0.5em;
+}
+
+.bz_bug #bugzilla-body th {
+ vertical-align: middle;
+}
diff --git a/skins/contrib/Xfce/buglist.css b/skins/contrib/Xfce/buglist.css
new file mode 100644
index 0000000..872dfd5
--- /dev/null
+++ b/skins/contrib/Xfce/buglist.css
@@ -0,0 +1,4 @@
+.bz_blocker,
+.bz_critical {
+ color: rgba( 180, 0, 0, 1 );
+}
\ No newline at end of file
diff --git a/skins/contrib/Xfce/favicon.ico b/skins/contrib/Xfce/favicon.ico
new file mode 100644
index 0000000..dd0c9fc
Binary files /dev/null and b/skins/contrib/Xfce/favicon.ico differ
diff --git a/skins/contrib/Xfce/global.css b/skins/contrib/Xfce/global.css
new file mode 100644
index 0000000..50852ce
--- /dev/null
+++ b/skins/contrib/Xfce/global.css
@@ -0,0 +1,596 @@
+body * {
+ font-family: 'Noto Sans', sans-serif !important;
+ box-sizing: border-box;
+}
+
+.group:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+ font-size: 0;
+}
+
+a, a:link, a:visited,
+a:hover, a:active, a:focus {
+ color: #06c;
+ text-decoration: none;
+}
+
+body pre,
+body pre * {
+ font-family: 'Noto Mono', monospace !important;
+ font-size: 100%;
+}
+
+hr {
+ clear: both;
+ display: block;
+ border: none;
+ border-bottom: 1px solid rgba( 0, 0, 0, 0.3 );
+ margin: 2em 0;
+}
+ hr + * {
+ margin-top: 0;
+ }
+
+/*
+ * Form stuff and links dressed as buttons
+ *
+ */
+
+/*.yui-skin-sam .yui-button a, */
+.action-link,
+.comment_tab,
+input[type="submit"],
+.bz_query_buttons #xml,
+button,
+select {
+ border-radius: 0.2em;
+ border: 1px solid rgba( 0, 0, 0, 0.2 );
+ background: #f7f7f7 linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ) repeat-x;
+ color: #000;
+ padding: 0.2em 0.5em;
+ outline: none !important;
+ transition: 150ms all;
+}
+ .yui-skin-sam .yui-button a:hover,
+ a.action-link:hover,
+ .comment_tab:hover,
+ input[type="submit"]:hover,
+ button:hover,
+ select:hover {
+ background-color: #fff;
+ }
+ .yui-skin-sam .yui-button a,
+ a.action-link {
+ font-size: 85%;
+ line-height: 1em;
+ color: #000;
+ }
+ .yui-skin-sam .yui-button a:hover, .yui-skin-sam .yui-button a:active, .yui-skin-sam .yui-button a:focus,
+ .action-link:hover, .action-link:active, .action-link:focus,
+ .comment_tab:hover, .comment_tab:active, .comment_tab:focus {
+ color: #06c;
+ }
+ select {
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ appearance: none;
+ }
+
+input,
+input[type="text"],
+textarea {
+ background-color: #f7f7f7;
+ color: #000;
+ border-radius: 0.2em;
+ border: 1px solid rgba( 0, 0, 0, 0.2 );
+ padding: 0.2em 0.5em;
+}
+ input[type="file"] { border: none; }
+ textarea {
+ font-size: 90%;
+ }
+
+input[type="checkbox"] {
+ float: left;
+ display: block;
+ opacity: 0.75;
+ margin-top: 0.15em;
+ margin-right: 0.5em;
+ transition: 150ms all;
+}
+ input[type="checkbox"]:checked {
+ opacity: 1;
+ }
+
+
+/*
+ * Header
+ *
+ */
+
+#header {
+ margin: 0 !important;
+ width: 100% !important;
+}
+ #header.scrolled {
+ position: fixed;
+ top: 0;
+ z-index: 2000;
+ }
+ #header #titles {
+ /* Used in the default template... */
+ display: none;
+ }
+/* #header a {
+ color: #fff;
+ } */
+ #header a:hover, #header a:active, #header a:focus {
+ border-bottom: 1px solid rgba( 255, 255, 255, 0.7 );
+ }
+
+#quicksearch_top,
+#find_top {
+ border: 1px solid rgba( 255, 255, 255, 0.1 );
+ background-color: rgba( 255, 255, 255, 0.25 );
+}
+#find_top {
+ background-color: rgba( 255, 255, 255, 0.5 );
+ transition: 150ms all;
+}
+ #find_top:hover {
+ background-color: rgba( 255, 255, 255, 0.75 );
+ }
+
+/*
+ * Body
+ *
+ */
+
+#bugzilla-body {
+ position: relative;
+ margin: 0 !important;
+ padding: 3em 1em 1em 1em !important;
+}
+ #bugzilla-body > h1:first-child,
+ #bugzilla-body > h2:first-child,
+ #bugzilla-body > h3:first-child {
+ margin-top: 0;
+ }
+
+/*
+ * Navigation
+ *
+ */
+
+#header ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+#header .links-dropdown {
+ position: relative;
+ float: right;
+}
+ #header .links-dropdown li.main {
+ position: relative;
+ z-index: 1000;
+ padding: 0.45em 1em;
+ }
+ #header .links-dropdown:hover li.main {
+ background-color: rgba( 255, 255, 255, 0.2 );
+ }
+ #header .links-dropdown ul {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding-top: 2.4em;
+ display: none;
+ box-shadow: 0 0 0.2em rgba( 0, 0, 0, 0.1 );
+ }
+ #header .links-dropdown:hover ul {
+ min-width: 200px;
+ display: block;
+ }
+ #header .links-dropdown li.main ul li {
+ background-color: #eee;
+ }
+ #header .links-dropdown:hover ul li:first-child {
+ padding-top: 0.5em;
+ }
+ #header .links-dropdown:hover ul li:last-child {
+ padding-bottom: 0.5em;
+ }
+ #header .links-dropdown a {
+ display: block;
+ border: none;
+ padding: 0.25em 1em;
+ }
+ #header .links-dropdown a:hover {
+ background-color: rgba( 255, 255, 255, 0.5 );
+ color: #000;
+ }
+
+ at media screen and (max-width:800px)�{
+}
+
+
+
+#header .links {
+ padding: 0.25em 1em;
+ border: none;
+ border-radius: 0;
+}
+ #header #common_links {
+ background-color: #00a8dd;
+ color: rgba( 255, 255, 255, 0.9 );
+ }
+ #header #common_links:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+ font-size: 0;
+ }
+ .links li {
+ margin-right: 0.5em;
+ }
+ .links li .separator {
+ display: none;
+ }
+ .links li a {
+ font-weight: bold;
+ }
+ #header .links li a {
+ color: #fff;
+ }
+ .links.links-primary {
+ float: left;
+ }
+
+/*
+ * Bug navigation and messages
+ *
+ */
+
+#bugzilla-body .navigation {
+ width: 100%;
+ position: absolute;
+ margin: 0;
+ top: 0;
+ left: 0;
+
+ padding: 0.25em 1em;
+ background-color: #eee;
+}
+ #bugzilla-body > dl:first-child {
+ background-color: #eee;
+ padding: 0.8em 1.3em;
+ border-left: 7px solid #00a8dd;
+ }
+ #bugzilla-body > dl:first-child code {
+ font-size: 100%;
+ }
+.navigation .nav_left { float: left; }
+.navigation .nav_right { float: right; font-size: 90%; }
+.navigation a,
+.navigation span {
+ margin: 0 0.3em;
+}
+
+/*
+ * Front page
+ *
+ */
+
+#page-index {
+ max-width: 100%;
+}
+
+#page-index #enter_bug { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-papericon.png); }
+#page-index #query { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-magnifier.png); }
+#page-index #account { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-person-alternate.png); }
+#page-index #help { background-image: linear-gradient( to bottom, rgba( 255, 255, 255, 0.5 ), rgba( 0, 0, 0, 0.02 ) 1px, rgba( 0, 0, 0, 0.05 ) ), url(index/bugzilla-questionmark2.png); }
+
+#page-index .bz_common_actions a {
+ width: 170px;
+ padding: 1em;
+ background-color: #f7f7f7;
+ background-position: 50% 0;
+ background-repeat: repeat-x, no-repeat;
+ border-radius: 0.5em;
+}
+ #page-index .bz_common_actions a:hover {
+ background-color: #fff;
+ }
+
+
+.rss {
+ background-image: url(rss.png);
+}
+
+/* Fix the related action links... */
+.related_actions {
+ font-size: 0.85em;
+ float: right;
+ white-space: nowrap;
+ margin: 0;
+ padding: 0;
+}
+ .related_actions li {
+ display: inline;
+ }
+
+ .related_actions.no-navigation {
+ display: block;
+ float: none;
+ text-align: right;
+ width: 100%;
+
+ box-sizing: border-box;
+ padding: 0.35em 1.25em;
+ margin-top: -0.1em !important;
+ background-color: #eee;
+ }
+ .related_actions:first-child + #useful-links {
+ clear: both;
+ }
+/* Browse */
+ul.product_categories {
+ list-style-type: none;
+ padding-left: 0;
+}
+ ul.product_categories li {
+ display: inline;
+ }
+ ul.product_categories li a {
+ font-size: 100%;
+ }
+
+
+h3.product_cat {
+ padding-top: 5em;
+ margin-top: -4em;
+ margin-bottom: 0;
+}
+ hr + h3.product_cat {
+ padding-top: 4em;
+ }
+ h3.product_cat + p {
+ margin-top: 0.25em;
+ margin-bottom: 1.25em;
+ }
+
+ul.products {
+ list-style-type: none;
+ padding-left: 0;
+ margin-left: 3em;
+ border-top: 1px solid rgba(0,0,0,0.2);
+}
+ ul.products li {
+ display: flex;
+ border-bottom: 1px solid rgba(0,0,0,0.2);
+ }
+ ul.products li:hover {
+ background-color: #f7f7f7;
+ }
+ ul.products li a {
+ display: block;
+ }
+ ul.products a.description {
+ color: #444;
+ }
+ ul.products strong {
+ flex: 20;
+ min-width: 220px;
+ padding: 0.2em 0;
+ }
+ ul.products div {
+ flex: 80;
+ font-size: 80%;
+ padding: 0.3em 0;
+ line-height: 1.5em;
+ }
+ ul.products span.product_components a {
+ font-size: 120%;
+ line-height: 1.6em;
+ display: inline;
+ white-space: nowrap;
+ margin-right: 0.5em;
+ }
+ ul.products span.product_components a:first-child:last-child,
+ ul.products span.product_components a.component-all {
+ font-style: oblique;
+ font-weight: bold;
+ }
+ ul.products span.product_components a.component-general,
+ ul.products span.product_components a.component-General {
+ font-weight: bold;
+ }
+
+
+/* Search */
+.bz_search_section {
+ background-color: #eee;
+ padding: 1em;
+}
+.field_help_link {
+ color: #000 !important;
+}
+
+tr.bz_row_odd {
+ /* Makes sure all odd rows have a background... */
+ background-color: #f7f7f7;
+}
+.bz_query_links .action-link {
+ font-size: 100%;
+}
+.bz_query_buttons #xml {
+ font-size: 100%;
+ margin-top: -0.25em;
+}
+.buglist_menu div {
+ line-height: 2.5em;
+}
+
+/* Common styles */
+a.bz_closed, a.bz_closed:link, a.bz_closed:visited,
+a.bz_closed:hover, a.bz_closed:active, a.bz_closed:focus {
+ text-decoration: line-through;
+}
+
+/* Bug statuses */
+.bz_bugitem .bz_bug_status_column {
+ position: relative;
+}
+ .bz_bugitem .bz_bug_status_column span {
+ display: inline-block;
+ width: 100%;
+ text-align: center;
+
+ border-radius: 0.2em;
+ padding: 0.15em 0.4em;
+ background-color: rgba( 0, 0, 0, 0.1 );
+ }
+
+.bz_bugitem.bz_NEW .bz_bug_status_column span,
+.bz_bugitem.bz_REOPENED .bz_bug_status_column span,
+.bz_bugitem.bz_UNCONFIRMED .bz_bug_status_column span,
+#status_resolution.NEW,
+#status_resolution.REOPENED,
+#status_resolution.UNCONFIRMED {
+ background-color: rgba( 0, 150, 210, 1 );
+ color: #fff;
+}
+ #status_resolution.NEW:hover,
+ #status_resolution.REOPENED:hover,
+ #status_resolution.UNCONFIRMED:hover {
+ background-color: rgba( 20, 170, 230, 1 );
+ }
+
+.bz_bugitem.bz_ASSIGNED .bz_bug_status_column span,
+.bz_bugitem.bz_NEEDINFO .bz_bug_status_column span,
+#status_resolution.ASSIGNED,
+#status_resolution.NEEDINFO {
+ background-color: rgba( 210, 150, 30, 1 );
+ color: #fff;
+}
+ #status_resolution.ASSIGNED:hover,
+ #status_resolution.NEEDINFO:hover {
+ background-color: rgba( 230, 170, 50, 1 );
+ }
+
+.bz_bugitem.bz_CLOSED .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_FIXED .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_WORKSFORME .bz_bug_status_column span,
+.bz_bugitem.bz_VERIFIED .bz_bug_status_column span,
+#status_resolution.CLOSED,
+#status_resolution.RESOLVED-FIXED,
+#status_resolution.RESOLVED-WORKSFORME,
+#status_resolution.VERIFIED {
+ background-color: rgba( 90, 180, 90, 1 );
+ color: #fff;
+}
+ #status_resolution.CLOSED:hover,
+ #status_resolution.RESOLVED-FIXED:hover,
+ #status_resolution.RESOLVED-WORKSFORME:hover,
+ #status_resolution.VERIFIED:hover {
+ background-color: rgba( 110, 200, 110, 1 );
+ }
+
+.bz_bugitem.bz_RESOLVED.bz_DUPLICATE .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_INVALID .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_MOVED .bz_bug_status_column span,
+.bz_bugitem.bz_RESOLVED.bz_WONTFIX .bz_bug_status_column span,
+#status_resolution.RESOLVED-DUPLICATE,
+#status_resolution.RESOLVED-INVALID,
+#status_resolution.RESOLVED-MOVED,
+#status_resolution.RESOLVED-WONTFIX {
+ background-color: rgba( 90, 90, 90, 1 );
+ color: #fff;
+}
+ #status_resolution.RESOLVED-DUPLICATE:hover,
+ #status_resolution.RESOLVED-INVALID:hover,
+ #status_resolution.RESOLVED-MOVED:hover,
+ #status_resolution.RESOLVED-WONTFIX:hover {
+ background-color: rgba( 110, 110, 110, 1 );
+ }
+
+ #status_resolution option {
+ background-color: #fff;
+ color: #000;
+ }
+
+/* Bug severities */
+.severity-critical select#bug_severity,
+.severity-blocker select#bug_severity {
+ background-color: rgba( 210, 0, 0, 1 );
+ color: #fff;
+}
+ .severity-critical select#bug_severity:hover,
+ .severity-blocker select#bug_severity:hover {
+ background-color: rgba( 230, 20, 20, 1 );
+ }
+
+ .severity select#bug_severity option {
+ background-color: #fff;
+ color: #000;
+ }
+
+.bz_bugitem {
+ color: inherit;
+ font-weight: normal;
+}
+ .bz_critical .bz_bug_status_column:after,
+ .bz_blocker .bz_bug_status_column:after {
+ position: absolute;
+ content: "!";
+ right: -1.5em;
+ padding: 0.15em 0.4em;
+ border-radius: 0.2em;
+ background-color: rgba( 210, 0, 0, 1 );
+ color: #fff;
+ font-weight: bold;
+ }
+ .bz_critical .bz_resolution_column,
+ .bz_blocker .bz_resolution_column {
+ color: transparent;
+ }
+
+ .bz_CLOSED .bz_bug_status_column:after,
+ .bz_RESOLVED .bz_bug_status_column:after,
+ .bz_VERIFIED .bz_bug_status_column:after {
+ display: none;
+ }
+ .bz_CLOSED .bz_resolution_column,
+ .bz_RESOLVED .bz_resolution_column,
+ .bz_VERIFIED .bz_resolution_column {
+ color: inherit;
+ }
+
+
+ at media screen and (max-width: 1100px) {
+ .links.links-secondary {
+ clear: left;
+ float: left;
+ display: block;
+ width: 100%;
+ background-color: rgba( 0, 0, 0, 0.1 );
+ margin-top: 0;
+ }
+}
+ at media screen and (max-width: 800px) {
+ #bugzilla-body {
+ padding-top: 4.5em !important;
+ }
+ .navigation .nav_right {
+ clear: left;
+ float: left;
+ margin-top: 0.3em;
+ }
+}
diff --git a/skins/contrib/Xfce/index/bugzilla-magnifier.png b/skins/contrib/Xfce/index/bugzilla-magnifier.png
new file mode 100644
index 0000000..b859b16
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-magnifier.png differ
diff --git a/skins/contrib/Xfce/index/bugzilla-papericon.png b/skins/contrib/Xfce/index/bugzilla-papericon.png
new file mode 100644
index 0000000..6775679
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-papericon.png differ
diff --git a/skins/contrib/Xfce/index/bugzilla-person-alternate.png b/skins/contrib/Xfce/index/bugzilla-person-alternate.png
new file mode 100644
index 0000000..a9e9ff2
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-person-alternate.png differ
diff --git a/skins/contrib/Xfce/index/bugzilla-questionmark2.png b/skins/contrib/Xfce/index/bugzilla-questionmark2.png
new file mode 100644
index 0000000..441d07f
Binary files /dev/null and b/skins/contrib/Xfce/index/bugzilla-questionmark2.png differ
diff --git a/skins/contrib/Xfce/rss.png b/skins/contrib/Xfce/rss.png
new file mode 100644
index 0000000..ff17763
Binary files /dev/null and b/skins/contrib/Xfce/rss.png differ
diff --git a/skins/contrib/Xfce/scripts.js b/skins/contrib/Xfce/scripts.js
new file mode 100644
index 0000000..068c45c
--- /dev/null
+++ b/skins/contrib/Xfce/scripts.js
@@ -0,0 +1,9 @@
+window.onscroll = function( ) {
+ var nav = document.getElementById( 'header' );
+ var xfceheader = document.getElementById( 'xfce-header' );
+ if( window.pageYOffset > ( nav.scrollHeight + xfceheader.scrollHeight + 100 ) ) {
+ nav.classList.add( 'scrolled' );
+ } else {
+ nav.classList.remove( 'scrolled' );
+ }
+}
diff --git a/template/en/custom/attachment/list.html.tmpl b/template/en/custom/attachment/list.html.tmpl
new file mode 100644
index 0000000..d71b58a
--- /dev/null
+++ b/template/en/custom/attachment/list.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'attachment/list_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'attachment/list_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/attachment/list_DEFAULT.html.tmpl b/template/en/custom/attachment/list_DEFAULT.html.tmpl
new file mode 120000
index 0000000..b32bb46
--- /dev/null
+++ b/template/en/custom/attachment/list_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/attachment/list.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/attachment/list_XFCE.html.tmpl b/template/en/custom/attachment/list_XFCE.html.tmpl
new file mode 100644
index 0000000..e7d42f5
--- /dev/null
+++ b/template/en/custom/attachment/list_XFCE.html.tmpl
@@ -0,0 +1,157 @@
+[%# 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.
+ #%]
+
+[% RETURN UNLESS attachments.size || Param("maxattachmentsize") || Param("maxlocalattachment") %]
+
+<script type="text/javascript">
+<!--
+function toggle_display(link) {
+ var table = document.getElementById("attachment_table");
+ var view_all = document.getElementById("view_all");
+ var hide_obsolete_url_parameter = "&hide_obsolete=1";
+ // Store current height for scrolling later
+ var originalHeight = table.offsetHeight;
+ var rows = YAHOO.util.Dom.getElementsByClassName(
+ 'bz_tr_obsolete', 'tr', table);
+
+ for (var i = 0; i < rows.length; i++) {
+ bz_toggleClass(rows[i], 'bz_default_hidden');
+ }
+
+ if (YAHOO.util.Dom.hasClass(rows[0], 'bz_default_hidden')) {
+ link.innerHTML = "Show Obsolete";
+ view_all.href = view_all.href + hide_obsolete_url_parameter
+ }
+ else {
+ link.innerHTML = "Hide Obsolete";
+ view_all.href = view_all.href.replace(hide_obsolete_url_parameter,"");
+ }
+
+ var newHeight = table.offsetHeight;
+ // This scrolling makes the window appear to not move at all.
+ window.scrollBy(0, newHeight - originalHeight);
+
+ return false;
+}
+//-->
+</script>
+
+<table id="attachment_table">
+ [% count = 0 %]
+ [% obsolete_attachments = 0 %]
+ [% user_cache = template_cache.users %]
+
+ [% FOREACH attachment = attachments %]
+ [% count = count + 1 %]
+ [% IF !attachment.isprivate || user.is_insider || attachment.attacher.id == user.id %]
+ [% IF attachment.isobsolete %]
+ [% obsolete_attachments = obsolete_attachments + 1 %]
+ [% END %]
+ <tr id="a[% count %]" class="[% "bz_contenttype_" _ attachment.contenttype
+ FILTER css_class_quote %]
+ [% " bz_patch" IF attachment.ispatch %]
+ [% " bz_private" IF attachment.isprivate %]
+ [% " bz_tr_obsolete bz_default_hidden"
+ IF attachment.isobsolete %]">
+ <td>
+ [% IF attachment.datasize %]
+ <a href="attachment.cgi?id=[% attachment.id %]"
+ title="View the content of the attachment">
+ [% END %]
+ <b>[% attachment.description FILTER html FILTER obsolete(attachment.isobsolete) %]</b>
+ [% "</a>" IF attachment.datasize %]
+
+ <span class="bz_attach_extra_info">
+ [% IF attachment.datasize %]
+ ([% attachment.datasize FILTER unitconvert %],
+ [% IF attachment.ispatch %]
+ patch)
+ [% ELSE %]
+ [%+ attachment.contenttype FILTER html %])
+ [% END %]
+ [% ELSE %]
+ (<em>deleted</em>)
+ [% END %]
+
+ <br>
+ <a href="#attach_[% attachment.id %]"
+ title="Go to the comment associated with the attachment">
+ [%- attachment.attached FILTER time("%Y-%m-%d %H:%M %Z") %]</a>,
+
+ [%# No need to recreate the exact same template if we already have it. %]
+ [% attacher_id = attachment.attacher.id %]
+ [% UNLESS user_cache.$attacher_id %]
+ [% user_cache.$attacher_id = BLOCK %]
+ [% INCLUDE global/user.html.tmpl who = attachment.attacher %]
+ [% END %]
+ [% END %]
+ [% user_cache.$attacher_id FILTER none %]
+ </span>
+ </td>
+
+ [% IF show_attachment_flags %]
+ <td class="bz_attach_flags">
+ [% IF attachment.flags.size == 0 %]
+ <i>no flags</i>
+ [% ELSE %]
+ [% FOREACH flag = attachment.flags %]
+ [% IF user.id %]
+ <span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
+ [% ELSIF flag.setter.name %]
+ <span title="[% flag.setter.name FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
+ [% ELSE %]
+ [% flag.setter.nick FILTER html %]:
+ [% END %]
+ [%+ flag.type.name FILTER html %][% flag.status %]
+ [%+ IF flag.status == "?" && flag.requestee %]
+ [% IF user.id %]
+ (<span title="[% flag.requestee.identity FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
+ [% ELSIF flag.requestee.name %]
+ (<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
+ [% ELSE %]
+ ([% flag.requestee.nick FILTER html %])
+ [% END %]
+ [% END %]<br>
+ [% END %]
+ [% END %]
+ </td>
+ [% END %]
+
+ <td>
+ <a href="attachment.cgi?id=[% attachment.id %]&action=edit">Details</a>
+ [% IF attachment.ispatch && feature_enabled('patch_viewer') %]
+ | <a href="attachment.cgi?id=[% attachment.id %]&action=diff">Diff</a>
+ [% END %]
+ [% Hook.process("action") %]
+ </td>
+ </tr>
+ [% END %]
+ [% END %]
+
+ <tr class="bz_attach_footer">
+ <td colspan="[% show_attachment_flags ? 3 : 2 %]">
+ [% IF attachments.size %]
+ <span class="bz_attach_view_hide">
+ [% IF obsolete_attachments %]
+ <a href="#a0" onclick="return toggle_display(this);">Show
+ Obsolete</a> ([% obsolete_attachments %])
+ [% END %]
+ [% IF Param("allow_attachment_display") %]
+ <a class="action-link" id="view_all" href="attachment.cgi?bugid=
+ [%- bugid %]&action=viewall
+ [%- "&hide_obsolete=1" IF obsolete_attachments %]">View All</a>
+ [% END %]
+ </span>
+ [% END %]
+ [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %]
+ <a href="attachment.cgi?bugid=[% bugid %]&action=enter">Add an attachment</a>
+ (proposed patch, testcase, etc.)
+ [% END %]
+ </td>
+ </tr>
+</table>
diff --git a/template/en/custom/bug/comments.html.tmpl b/template/en/custom/bug/comments.html.tmpl
new file mode 100644
index 0000000..108d797
--- /dev/null
+++ b/template/en/custom/bug/comments.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'bug/comments_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'bug/comments_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/comments_DEFAULT.html.tmpl b/template/en/custom/bug/comments_DEFAULT.html.tmpl
new file mode 120000
index 0000000..be5d57e
--- /dev/null
+++ b/template/en/custom/bug/comments_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/comments.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/comments_XFCE.html.tmpl b/template/en/custom/bug/comments_XFCE.html.tmpl
new file mode 100644
index 0000000..a87215f
--- /dev/null
+++ b/template/en/custom/bug/comments_XFCE.html.tmpl
@@ -0,0 +1,224 @@
+[%# 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 bug/time.html.tmpl %]
+
+<script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript">
+</script>
+
+<script type="text/javascript">
+<!--
+ /* Adds the reply text to the 'comment' textarea */
+ function replyToComment(id, real_id, name) {
+ var prefix = "(In reply to " + name + " from comment #" + id + ")\n";
+ var replytext = "";
+ [% IF user.settings.quote_replies.value == 'quoted_reply' %]
+ /* pre id="comment_name_N" */
+ var text_elem = document.getElementById('comment_text_'+id);
+ var text = getText(text_elem);
+ replytext = prefix + wrapReplyText(text);
+ [% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
+ replytext = prefix;
+ [% END %]
+
+ [% IF user.is_insider %]
+ if (document.getElementById('isprivate_' + real_id).checked) {
+ document.getElementById('newcommentprivacy').checked = 'checked';
+ updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
+ }
+ [% END %]
+
+ /* <textarea id="comment"> */
+ var textarea = document.getElementById('comment');
+ if (textarea.value != replytext) {
+ textarea.value += replytext;
+ }
+
+ textarea.focus();
+ }
+//-->
+</script>
+
+[% DEFAULT mode = "show" %]
+[% user_cache = template_cache.users %]
+[% can_edit_comments = bug.check_can_change_field('longdesc', 0, 1) %]
+[% can_tag_comments = feature_enabled('jsonrpc') AND user.can_tag_comments %]
+
+[% IF mode == "edit" %]
+ <ul class="bz_collapse_expand_comments">
+ <li><a href="#" class="action-link" onclick="toggle_all_comments('collapse');
+ return false;">Collapse All Comments</a></li>
+ <li><a href="#" class="action-link" onclick="toggle_all_comments('expand');
+ return false;">Expand All Comments</a></li>
+ [% IF Param('comment_taggers_group') %]
+ <li><div id="comment_tags_collapse_expand_container"></div></li>
+ [% END %]
+ </ul>
+[% END %]
+
+[% PROCESS display_comments %]
+
+[% Hook.process("aftercomments") %]
+
+[%############################################################################%]
+[%# Block for individual comments #%]
+[%############################################################################%]
+
+[% BLOCK display_comments %]
+ [% FOREACH comment = comments %]
+ [% NEXT IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %]
+ [% comment_text = comment.body_full %]
+ [% NEXT IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
+
+ <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
+ [% " bz_default_collapsed" IF comment.collapsed %]
+ [% " bz_comment_hilite" IF marks.${comment.count} %]
+ [% " bz_first_comment" IF comment.count == 0 %]">
+ [% IF comment.count == 0 %]
+ [% class_name = "bz_first_comment_head" %]
+ [% comment_label = "Description" %]
+ [% ELSE %]
+ [% class_name = "bz_comment_head" %]
+ [% comment_label = "Comment " _ comment.count %]
+ [% END %]
+
+ <div class="[% class_name FILTER html %]">
+ [% IF mode == "edit" %]
+ <span class="bz_comment_actions">
+ [% IF comment.collapsed %]
+ <span class="bz_collapsed_actions">
+ [% END %]
+ [% IF can_edit_comments %]
+ [% IF can_tag_comments %]
+ <a href="#" onclick="YAHOO.bugzilla.commentTagging.toggle([% comment.id %], [% comment.count %]);return false" class="action-link">tag</a>
+ [% END %]
+ <a class="bz_reply_link action-link" href="#add_comment"
+ [% IF user.settings.quote_replies.value != 'off' %]
+ onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;"
+ [% END %]
+ >reply</a>
+ [% END %]
+ [% IF comment.collapsed %]
+ </span>
+ [% END %]
+ <script type="text/javascript">
+ function addCollapseLinkXfce(count, collapsed, title) {
+ document.write(' <a href="#" class="bz_collapse_comment action-link"' +
+ ' id="comment_link_' + count +
+ '" onclick="toggle_comment_display(this, ' + count +
+ '); return false;" title="' + title + '">[' +
+ (collapsed ? '+' : '−') + ']<\/a> ');
+ }
+ addCollapseLinkXfce([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display');
+ </script>
+ </span>
+ [% ELSIF comment.collapsed %]
+ <span class="bz_comment_actions">
+ <script type="text/javascript">
+ function addCollapseLinkXfce(count, collapsed, title) {
+ document.write(' <a href="#" class="bz_collapse_comment action-link"' +
+ ' id="comment_link_' + count +
+ '" onclick="toggle_comment_display(this, ' + count +
+ '); return false;" title="' + title + '">[' +
+ (collapsed ? '+' : '−') + ']<\/a> ');
+ }
+ addCollapseLinkXfce([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display');
+ </script>
+ </span>
+ [% END %]
+
+ [% IF mode == "edit" && can_edit_comments && user.is_insider %]
+ <div class="bz_private_checkbox">
+ <input type="hidden" value="1"
+ name="defined_isprivate_[% comment.id %]">
+ <input type="checkbox"
+ name="isprivate_[% comment.id %]" value="1"
+ id="isprivate_[% comment.id %]"
+ onClick="updateCommentPrivacy(this, [% comment.count %])"
+ [% " checked=\"checked\"" IF comment.is_private %]>
+ <label for="isprivate_[% comment.id %]">Private</label>
+ </div>
+ [% END %]
+
+ <span class="bz_comment_number">
+ <a
+ href="show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]">
+ [%- comment_label FILTER html %]</a>
+ </span>
+
+ <span class="bz_comment_user">
+ [%# No need to recreate the exact same template if we already have it. %]
+ [% commenter_id = comment.author.id %]
+ [% UNLESS user_cache.$commenter_id %]
+ [% user_cache.$commenter_id = BLOCK %]
+ [% INCLUDE global/user.html.tmpl who = comment.author %]
+ [% END %]
+ [% END %]
+ [% user_cache.$commenter_id FILTER none %]
+ </span>
+
+ <span class="bz_comment_user_images">
+ [% FOREACH group = comment.author.groups_with_icon %]
+ <img src="[% group.icon_url FILTER html %]"
+ alt="[% group.name FILTER html %]"
+ title="[% group.name FILTER html %] - [% group.description FILTER html %]">
+ [% END %]
+ </span>
+
+ <span class="bz_comment_time">
+ [%+ comment.creation_ts FILTER time %]
+ </span>
+
+ [% IF comment.collapsed %]
+ <span id="cr[% comment.count %]" class="bz_comment_collapse_reason"
+ title="[% comment.author.name || comment.author.login FILTER html %]
+ [%~ %] [[% comment.creation_ts FILTER time %]]">
+ Comment hidden ([% comment.tags.join(', ') FILTER html %])
+ </span>
+ [% END %]
+ </div>
+
+ [% IF user.is_timetracker &&
+ (comment.work_time > 0 || comment.work_time < 0) %]
+ <br>
+ Additional hours worked:
+ [% PROCESS formattimeunit time_unit=comment.work_time %]
+ [% END %]
+
+ [% IF user.id && Param('comment_taggers_group') %]
+ <div id="comment_tag_[% comment.count FILTER html %]"
+ class="bz_comment_tags">
+ <span id="ct_[% comment.count %]"
+ class="[% 'bz_default_hidden' UNLESS comment.tags.size %]">
+ [% IF comment.tags.size %]
+ <script>
+ YAHOO.bugzilla.commentTagging.showTags([% comment.id FILTER none %],
+ [% comment.count FILTER none %], [
+ [% FOREACH tag = comment.tags %]
+ [%~%]'[% tag FILTER js %]'[% "," UNLESS loop.last %]
+ [% END %]
+ [%~%]]);
+ </script>
+ [% END %]
+ </span>
+ </div>
+ [% END %]
+
+[%# Don't indent the <pre> block, since then the spaces are displayed in the
+ # generated HTML
+ #%]
+<pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]"
+ [% IF mode == "edit" || comment.collapsed %]
+ id="comment_text_[% comment.count FILTER none %]"
+ [% END %]>
+ [%- comment_text FILTER quoteUrls(bug, comment) -%]
+</pre>
+ [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %]
+ </div>
+ [% END %]
+[% END %]
diff --git a/template/en/custom/bug/create/create.html.tmpl b/template/en/custom/bug/create/create.html.tmpl
new file mode 100644
index 0000000..fbc3fca
--- /dev/null
+++ b/template/en/custom/bug/create/create.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% INCLUDE bug/create/create_XFCE.html.tmpl %]
+[% ELSE %]
+ [% INCLUDE bug/create/create_DEFAULT.html.tmpl %]
+[% END %]
diff --git a/template/en/custom/bug/create/create_DEFAULT.html.tmpl b/template/en/custom/bug/create/create_DEFAULT.html.tmpl
new file mode 120000
index 0000000..97b771a
--- /dev/null
+++ b/template/en/custom/bug/create/create_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../../default/bug/create/create.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/create/create_XFCE.html.tmpl b/template/en/custom/bug/create/create_XFCE.html.tmpl
new file mode 100644
index 0000000..6d35832
--- /dev/null
+++ b/template/en/custom/bug/create/create_XFCE.html.tmpl
@@ -0,0 +1,619 @@
+[%# 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 %]Enter [% terms.Bug %]: [% product.name FILTER html %][% END %]
+[% use_qa_contact = Param("useqacontact") %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ generate_api_token = 1
+ yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ]
+ style_urls = ['skins/standard/bug.css']
+ javascript_urls = [ "js/attachment.js", "js/util.js",
+ "js/field.js", "js/TUI.js", "js/bug.js" ]
+ onload = "set_assign_to($use_qa_contact); hideElementById('attachment_true');
+ showElementById('attachment_false'); showElementById('btn_no_attachment');"
+%]
+
+<script type="text/javascript">
+<!--
+
+var initialowners = new Array([% product.components.size %]);
+var last_initialowner;
+var initialccs = new Array([% product.components.size %]);
+var components = new Array([% product.components.size %]);
+var comp_desc = new Array([% product.components.size %]);
+var flags = new Array([% product.components.size %]);
+[% IF Param("useqacontact") %]
+ var initialqacontacts = new Array([% product.components.size %]);
+ var last_initialqacontact;
+[% END %]
+[% count = 0 %]
+[%- FOREACH c = product.components %]
+ [% NEXT IF NOT c.is_active %]
+ components[[% count %]] = "[% c.name FILTER js %]";
+ comp_desc[[% count %]] = "[% c.description FILTER html_light FILTER js %]";
+ initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]";
+ [% flag_list = [] %]
+ [% FOREACH f = c.flag_types.bug %]
+ [% NEXT UNLESS f.is_active %]
+ [% flag_list.push(f.id) %]
+ [% END %]
+ [% FOREACH f = c.flag_types.attachment %]
+ [% NEXT UNLESS f.is_active %]
+ [% flag_list.push(f.id) %]
+ [% END %]
+ flags[[% count %]] = [[% flag_list.join(",") FILTER js %]];
+ [% IF Param("useqacontact") %]
+ initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]";
+ [% END %]
+
+ [% SET initial_cc_list = [] %]
+ [% FOREACH cc_user = c.initial_cc %]
+ [% initial_cc_list.push(cc_user.login) %]
+ [% END %]
+ initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]";
+
+ [% count = count + 1 %]
+[%- END %]
+
+var status_comment_required = new Array();
+[% FOREACH status = bug_status %]
+ status_comment_required['[% status.name FILTER js %]'] =
+ [% status.comment_required_on_change_from() ? 'true' : 'false' %]
+[% END %]
+
+TUI_alternates['expert_fields'] = 'Show Advanced Fields';
+// Hide the Advanced Fields by default, unless the user has a cookie
+// that specifies otherwise.
+TUI_hide_default('expert_fields');
+// Also hide the "Paste text as attachment" textarea by default.
+TUI_hide_default('attachment_text_field');
+-->
+</script>
+
+<form name="Create" id="Create" method="post" action="post_bug.cgi"
+ class="enter_bug_form" enctype="multipart/form-data"
+ onsubmit="return validateEnterBug(this)">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+ <p class="note note-before">[%PROCESS 'bug/create/user-message.html.tmpl' %]</p>
+
+ <h1>File a bug for [% product.name %]</h1>
+ <p style="margin-top: -1em;">Reporting as [% user.login %]. Required fields are marked with an <span class="required_star">*</span>.</p>
+
+ <div class="filebug-row">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.short_desc editable = 1, tag_name = 'b'
+ %]<br />
+ <input name="short_desc" size="70" value="[% short_desc FILTER html %]" maxlength="255" spellcheck="true"
+ aria-required="true" class="req text_input" id="short_desc">
+ </div>
+
+ [% IF feature_enabled('jsonrpc') AND !cloned_bug_id
+ AND user.settings.possible_duplicates.value == 'on' %]
+ <div id="possible_duplicates_container" class="filebug-row bz_default_hidden">
+ <b>Possible Duplicates:</b><br />
+
+ <div id="possible_duplicates"></div>
+
+ <script type="text/javascript">
+ var dt_columns = [
+ { key: "id", label: "[% field_descs.bug_id FILTER js %]",
+ formatter: YAHOO.bugzilla.dupTable.formatBugLink },
+ { key: "summary",
+ label: "[% field_descs.short_desc FILTER js %]",
+ formatter: "text" },
+ { key: "status",
+ label: "[% field_descs.bug_status FILTER js %]",
+ formatter: YAHOO.bugzilla.dupTable.formatStatus },
+ { key: "update_token", label: '',
+ formatter: YAHOO.bugzilla.dupTable.formatCcButton }
+ ];
+ YAHOO.bugzilla.dupTable.addCcMessage = "Add Me to the CC List";
+ YAHOO.bugzilla.dupTable.init({
+ container: 'possible_duplicates',
+ columns: dt_columns,
+ product_name: '[% product.name FILTER js %]',
+ summary_field: 'short_desc',
+ options: {
+ MSG_LOADING: 'Searching for possible duplicates...',
+ MSG_EMPTY: 'No possible duplicates found.',
+ SUMMARY: 'Possible Duplicates'
+ }
+ });
+ </script>
+ </div>
+ [% END %]
+
+ <div class="filebug-row">
+ <b>Description:</b><br />
+ [%# defaultcontent = BLOCK %]
+ [% IF cloned_bug_id %]
+ <span class="note note-cloned">This [% terms.bug %] was initially created as a clone of [% terms.bug %] [% cloned_bug_id %].</span><br />
+ [% END %]
+ [% comment FILTER none %]
+ [% INCLUDE bug/comment.html.tmpl
+ minrows = 10
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+ defaultcontent = defaultcontent
+ %]
+ </div>
+
+ <div class="filebug-row filebug-flex">
+ <div class="flex-item">
+ [% component_desc_url = BLOCK -%]
+ describecomponents.cgi?product=[% product.name FILTER uri %]
+ [% END %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.component editable = 1,
+ desc_url = component_desc_url, tag_name = 'b'
+ %]
+ <br />
+ <select name="component" id="component" onchange="set_assign_to([% Param("useqacontact") %]);"
+ aria-required="true" class="req">
+ [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %]
+ [% IF Param("usemenuforusers") %]
+ [% assignees_list = user.get_userlist.clone %]
+ [% qa_contacts_list = user.get_userlist.clone %]
+ [% END %]
+
+ [%- FOREACH c = product.components %]
+ [% NEXT IF NOT c.is_active %]
+ <option value="[% c.name FILTER html %]"
+ id="v[% c.id FILTER html %]_component"
+ [% IF c.name.lower == default.component_.lower %]
+ [%# This is for bug/field.html.tmpl, for visibility-related
+ # controls. %]
+ [% default.component_id = c.id %]
+ selected="selected"
+ [% END %]>
+ [% c.name FILTER html -%]
+ </option>
+ [% IF Param("usemenuforusers") %]
+ [% INCLUDE build_userlist default_user = c.default_assignee,
+ userlist = assignees_list %]
+ [% INCLUDE build_userlist default_user = c.default_qa_contact,
+ userlist = qa_contacts_list %]
+ [% END %]
+ [%- END %]
+ </select>
+ </div>
+ <div class="flex-item">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.version editable = 1, tag_name = 'b'
+ %]
+ <br />
+ <select name="version" id="version" aria-required="true" class="req">
+ [%- FOREACH v = version %]
+ [% NEXT IF NOT v.is_active %]
+ <option value="[% v.name FILTER html %]"
+ [% ' selected="selected"' IF v.name == default.version %]>[% v.name FILTER html -%]
+ </option>
+ [%- END %]
+ </select>
+ </div>
+ <div class="flex-item">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.rep_platform editable = 1, tag_name = 'b'
+ %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.rep_platform, editable = 1,
+ value = default.rep_platform, no_label = 1, no_tds = 1
+ %]
+ </div>
+ <div class="flex-item">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.op_sys editable = 1, tag_name = 'b'
+ %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.op_sys, editable = 1,
+ value = default.op_sys, no_label = 1, no_tds = 1
+ %]
+ </div>
+ </div>
+ <div class="filebug-row filebug-flex">
+ <div class="flex-item expert_fields">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.bug_severity editable = 1, tag_name ='b'
+ %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.bug_severity, editable = 1,
+ value = default.bug_severity, no_label = 1, no_tds = 1
+ %]
+ </div>
+ [% IF Param('letsubmitterchoosepriority') %]
+ <div class="flex-item expert_fields">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.priority editable = 1, tag_name = 'b'
+ %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.priority, editable = 1,
+ value = default.priority, no_label = 1, no_tds = 1
+ %]
+ </div>
+ [% END %]
+ [% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %]
+ <div class="flex-item expert_fields">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.target_milestone, tag_name = 'b'
+ %]
+ <br />
+ [% INCLUDE select field = bug_fields.target_milestone,
+ no_label = 1, no_tds = 1 %]
+ </div>
+ [% END %]
+ <div class="flex-item expert_fields">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.bug_status editable = 1, tag_name = 'b'
+ %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.bug_status,
+ editable = (bug_status.size > 1), value = default.bug_status
+ override_legal_values = bug_status, no_label = 1, no_tds = 1
+ %]
+ </div>
+ </div>
+
+ [% IF (!Param('defaultplatform') || !Param('defaultopsys')) && !cloned_bug_id %]
+ <p class="note note-guess-os">
+ We've made a guess at your
+ [% IF Param('defaultplatform') %]
+ operating system. Please check it
+ [% ELSIF Param('defaultopsys') %]
+ platform. Please check it
+ [% ELSE %]
+ operating system and platform. Please check them
+ [% END %]
+ and make any corrections if necessary.
+ </p>
+ [% END %]
+
+
+ [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %]
+ <div class="filebug-row">
+ <b>Attachment:</b>
+ <span id="attachment_false" class="bz_default_hidden">
+ <input type="button" value="Add an attachment" onClick="handleWantsAttachment(true)">
+ </span>
+ <span id="attachment_true">
+ <input type="button" id="btn_no_attachment" value="Don't add an attachment"
+ class="bz_default_hidden" onClick="handleWantsAttachment(false)">
+ <div class="popup">
+ <table class="attachment_entry">
+ [% PROCESS attachment/createformcontents.html.tmpl
+ flag_types = product.flag_types.attachment
+ any_flags_requesteeble = 1
+ flag_table_id ="attachment_flags" %]
+ </table>
+ </div>
+ </span>
+ </div>
+ [% END %]
+
+ <hr />
+
+ [%# SUBMIT BUG %]
+ <div class="filebug-row">
+ <input type="submit" id="commit_top" value="Submit [% terms.Bug %]">
+ <span style="padding: 0 0.5em;">or</span>
+
+ <a id="expert_fields_controller" class="action-link bz_default_hidden" href="javascript:TUI_toggle_class('expert_fields')">Hide Advanced Fields</a>
+ <script type="text/javascript">YAHOO.util.Dom.removeClass('expert_fields_controller','bz_default_hidden');</script>
+ </div>
+
+ <hr class="expert_fields" />
+
+ [%# Note: template below this point is mostly unreviewed! %]
+
+ <table>
+ <tbody class="expert_fields">
+ <tr>
+ <th>Flags:</th>
+ <td>
+ [% IF product.flag_types.bug.size > 0 %]
+ [% display_flag_headers = 0 %]
+ [% any_flags_requesteeble = 0 %]
+
+ [% FOREACH flag_type = product.flag_types.bug %]
+ [% NEXT UNLESS flag_type.is_active %]
+ [% display_flag_headers = 1 %]
+ [% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %]
+ [% END %]
+
+ [% IF display_flag_headers %]
+ [% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug
+ any_flags_requesteeble = any_flags_requesteeble
+ flag_table_id = "bug_flags", flag_no_header = 1
+ %]
+ [% END %]
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.assigned_to editable = 1
+ %]
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ id => "assigned_to"
+ name => "assigned_to"
+ value => assigned_to
+ disabled => assigned_to_disabled
+ size => 30
+ emptyok => 1
+ custom_userlist => assignees_list
+ %]
+ <noscript>(Leave blank to assign to component's default assignee)</noscript>
+ </td>
+ </tr>
+
+ [% IF Param("useqacontact") %]
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.qa_contact editable = 1
+ %]
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ id => "qa_contact"
+ name => "qa_contact"
+ value => qa_contact
+ disabled => qa_contact_disabled
+ size => 30
+ emptyok => 1
+ custom_userlist => qa_contacts_list
+ %]
+ <noscript>(Leave blank to assign to default qa contact)</noscript>
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.cc editable = 1
+ %]
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "cc"
+ name => "cc"
+ value => cc
+ disabled => cc_disabled
+ size => 30
+ multiple => 5
+ %]
+ </td>
+ </tr>
+
+<!-- <tr>
+ <th>Default [% field_descs.cc FILTER html %]:</th>
+ <td>
+ <div id="initial_cc">
+ </div>
+ </td>
+ </tr> -->
+
+ [% IF user.is_timetracker %]
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.estimated_time editable = 1
+ %]
+ <td>
+ <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.deadline, value = deadline,
+ editable = 1, value_span = 2 %]
+ </tr>
+ [% END %]
+
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.alias editable = 1
+ %]
+ <td>
+ <input name="alias" size="20" value="[% alias FILTER html %]">
+ </td>
+ </tr>
+
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.bug_file_loc editable = 1
+ %]
+ <td class="field_value">
+ <input name="bug_file_loc" id="bug_file_loc" class="text_input"
+ size="40" value="[% bug_file_loc FILTER html %]">
+ </td>
+ </tr>
+ </tbody>
+
+ <tbody class="expert_fields">
+ [% USE Bugzilla %]
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ [% NEXT UNLESS field.enter_bug %]
+ [% SET value = ${field.name}.defined ? ${field.name} : "" %]
+ <tr [% 'class="expert_fields"' IF !field.is_mandatory %]>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = field, value = value, editable = 1 %]
+ </tr>
+ [% END %]
+ </tbody>
+
+ <tbody class="expert_fields">
+ [% IF user.is_insider %]
+ <tr>
+ <th> </th>
+ <td>
+
+ <input type="checkbox" id="comment_is_private" name="comment_is_private"
+ [% ' checked="checked"' IF comment_is_private %]
+ onClick="updateCommentTagControl(this, 'comment')">
+ <label for="comment_is_private">
+ Make description and any new attachment private (visible only to members
+ of the <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+ </td>
+ </tr>
+ <script>
+ updateCommentTagControl(document.getElementById('comment_is_private'), 'comment');
+ </script>
+ [% END %]
+ </tbody>
+
+ <tbody class="expert_fields">
+ [% IF use_keywords %]
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = bug_fields.keywords, editable = 1,
+ value = keywords, possible_values = all_keywords,
+ desc_url = "describekeywords.cgi", value_span = 3
+ %]
+ </tr>
+ [% END %]
+
+ [% IF user.in_group('editbugs', product.id) %]
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.dependson editable = 1
+ %]
+ <td>
+ <input name="dependson" accesskey="d" value="[% dependson FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.blocked editable = 1
+ %]
+ <td>
+ <input name="blocked" accesskey="b" value="[% blocked FILTER html %]">
+ </td>
+ </tr>
+ [% END %]
+
+ [% IF Param('use_see_also') %]
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default
+ field = bug_fields.see_also
+ editable = 1
+ value = see_also
+ %]
+ </tr>
+ [% END %]
+ </tbody>
+
+ <tbody class="expert_fields">
+ [% IF product.groups_available.size %]
+ <tr>
+ <th> </th>
+ <td>
+ <br>
+ <strong>
+ Only users in [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %] of the selected groups can view this
+ [%+ terms.bug %]:
+ </strong>
+ <br>
+ <span class="bz_info">
+ (Leave all boxes unchecked to make this a public [% terms.bug %].)
+ </span>
+ <br>
+ <br>
+
+ <!-- Checkboxes -->
+ <input type="hidden" name="defined_groups" value="1">
+ [% FOREACH group = product.groups_available %]
+ <input type="checkbox" id="group_[% group.id FILTER html %]"
+ name="groups" value="[% group.name FILTER html %]"
+ [% ' checked="checked"' IF default.groups.contains(group.name)
+ OR group.is_default %]>
+ <label for="group_[% group.id FILTER html %]">
+ [%- group.description FILTER html_light %]</label><br>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+
+ <hr class="expert_fields" />
+
+ [%# SUBMIT BUG %]
+ <div class="filebug-row expert_fields">
+ <input type="submit" id="commit" value="Submit [% terms.Bug %]">
+ <span style="padding: 0 0.5em;">or</span>
+
+ <input type="submit" name="maketemplate" id="maketemplate"
+ value="Remember values as bookmarkable template"
+ onclick="bz_no_validate_enter_bug=true" class="action-link">
+ </div>
+
+ [% Hook.process("form") %]
+
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+[%# Links or content with more information about the bug being created. %]
+[% Hook.process("end") %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+
+ [% IF no_label != 1 %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = field editable = 1
+ %]
+ [% END %]
+ [% IF no_tds != 1 %]
+ <td>
+ [% END %]
+ <select name="[% field.name FILTER html %]"
+ id="[% field.name FILTER html %]">
+ [%- FOREACH x = ${field.name} %]
+ [% NEXT IF NOT x.is_active %]
+ <option value="[% x.name FILTER html %]"
+ [% " selected=\"selected\"" IF x.name == default.${field.name} %]>
+ [% display_value(field.name, x.name) FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ [% IF no_tds != 1 %]
+ </td>
+ [% END %]
+[% END %]
+
+[% BLOCK build_userlist %]
+ [% user_found = 0 %]
+ [% default_login = default_user.login %]
+ [% RETURN UNLESS default_login %]
+
+ [% FOREACH user = userlist %]
+ [% IF user.login == default_login %]
+ [% user_found = 1 %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+
+ [% userlist.push({login => default_login,
+ identity => default_user.identity,
+ visible => 1})
+ UNLESS user_found %]
+[% END %]
diff --git a/template/en/custom/bug/edit.html.tmpl b/template/en/custom/bug/edit.html.tmpl
new file mode 100644
index 0000000..f6b9aae
--- /dev/null
+++ b/template/en/custom/bug/edit.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'bug/edit_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'bug/edit_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/edit_DEFAULT.html.tmpl b/template/en/custom/bug/edit_DEFAULT.html.tmpl
new file mode 120000
index 0000000..120cff3
--- /dev/null
+++ b/template/en/custom/bug/edit_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/edit.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/edit_XFCE.html.tmpl b/template/en/custom/bug/edit_XFCE.html.tmpl
new file mode 100644
index 0000000..35b9a0c
--- /dev/null
+++ b/template/en/custom/bug/edit_XFCE.html.tmpl
@@ -0,0 +1,1183 @@
+[%# 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 bug/time.html.tmpl %]
+
+[% IF Param('comment_taggers_group') %]
+ [% IF user.can_tag_comments %]
+ <div id="bz_ctag_div" class="bz_default_hidden">
+ <a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideInput()">x</a>
+ <div>
+ <input id="bz_ctag_add" size="10" placeholder="add tag"
+ maxlength="[% constants.MAX_COMMENT_TAG_LENGTH FILTER html %]">
+ <span id="bz_ctag_autocomp"></span>
+ </div>
+
+ </div>
+ <div id="bz_ctag_error" class="bz_default_hidden">
+ <a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideError()">x</a>
+ <span id="bz_ctag_error_msg"></span>
+ </div>
+ [% END %]
+ [% IF user.id %]
+ <script type="text/javascript">
+ YAHOO.bugzilla.commentTagging.init([% user.can_tag_comments ? 'true' : 'false' %]);
+ YAHOO.bugzilla.commentTagging.min_len = [% constants.MIN_COMMENT_TAG_LENGTH FILTER js %];
+ YAHOO.bugzilla.commentTagging.max_len = [% constants.MAX_COMMENT_TAG_LENGTH FILTER js %];
+ YAHOO.bugzilla.commentTagging.label = 'Comment Tags:';
+ YAHOO.bugzilla.commentTagging.min_len_error =
+ 'Comment tags must be at least
+ [%~ " " _ constants.MIN_COMMENT_TAG_LENGTH FILTER js %] characters.';
+ YAHOO.bugzilla.commentTagging.max_len_error =
+ 'Comment tags cannot be longer than
+ [%~ " " _ constants.MAX_COMMENT_TAG_LENGTH FILTER js %] characters.';
+ </script>
+ [% END %]
+[% END %]
+
+<script type="text/javascript">
+<!--
+[% IF user.is_timetracker %]
+ var bz_remaining_time = [% bug.remaining_time %];
+[% END %]
+
+[% IF user.id %]
+ /* Index all classifications so we can keep track of the classification
+ * for the selected product, which could control field visibility.
+ */
+ var all_classifications = new Array([% bug.choices.product.size %]);
+ [%- FOREACH product = bug.choices.product %]
+ all_classifications['[% product.name FILTER js %]'] = '
+ [%- product.classification.name FILTER js %]';
+ [%- END %]
+[% END %]
+//-->
+</script>
+
+<form name="changeform" id="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
+ <input type="hidden" name="id" value="[% bug.bug_id %]">
+ <input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
+
+ <div id="bug-header" class="group">
+ <div id="bug-title">
+ <div id="summary_container">
+ <a href="show_bug.cgi?id=[% bug.bug_id %]" class="bug_title">
+ <span id="short_desc_nonedit_display_custom">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
+ </a>
+ </div>
+ <div id="summary_input">
+ [% PROCESS input inputname => "short_desc" size => "80"
+ maxlength => 255 spellcheck => "true" no_td => 1 %]
+ </div>
+ <script type="text/javascript">
+ hideEditableField('summary_container',
+ 'summary_input',
+ 'summary_edit_action',
+ 'short_desc',
+ '[% bug.short_desc FILTER js %]' );
+ </script>
+ </div>
+
+ [% IF user.id %]
+ <div id="bug-primary-actions">
+ [% IF bug.check_can_change_field('short_desc', 0, 1) %]
+ <a href="#" id="summary_edit_action" class="action-link">Edit title</a>
+ [% END %]
+ <input type="submit" value="Save Changes" id="commit_top">
+ </div>
+ [% END %]
+ </div>
+
+ <div id="bug-layout">
+ <div id="bug-main">
+
+ [%# #%]
+ [%# MAIN INFORMATION #%]
+ [%# #%]
+
+ <div class="bug-row bug-flex" style="margin-top: 1em;">
+
+ [%# Status #%]
+
+ <div class="flex-item flex-status status status-[% bug.bug_status %]">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.bug_status
+ tag_name = 'b' %]
+ <br />
+ [% PROCESS bug/knob.html.tmpl %]
+ </div>
+
+ [%# Priority #%]
+
+ [% can_edit_priority = bug.check_can_change_field('priority', 0, 1) %]
+ <div class="flex-item">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.priority
+ tag_name = 'b' %]
+ <br />
+ <span class="select">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.priority
+ no_tds = 1, value = bug.priority
+ override_legal_values = bug.choices.priority
+ editable = can_edit_priority %]
+ </span>
+ </div>
+
+ [%# Severity #%]
+
+ <div class="flex-item severity severity-[% bug.bug_severity %]">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.bug_severity
+ tag_name = 'b' %]
+ <br />
+ <span class="select">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.bug_severity
+ no_tds = 1, value = bug.bug_severity
+ override_legal_values = bug.choices.bug_severity
+ editable = can_edit_priority %]
+ </span>
+ </div>
+ </div>
+
+ [%# PRODUCT INFORMATION #%]
+
+ <div class="bug-row bug-flex">
+
+ [%# Product #%]
+
+ <div class="flex-item flex-product">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.product
+ tag_name = 'b' %]
+ <br />
+ <span class="select">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.product, value = bug.product
+ override_legal_values = bug.choices.product
+ desc_url = "describecomponents.cgi"
+ editable = bug.check_can_change_field('product', 0, 1)
+ no_tds = 1
+ %]
+ </span>
+ </div>
+
+ [%# Component #%]
+
+ <div class="flex-item flex-component">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.component
+ tag_name = 'b' %]
+ <br />
+ <div class="flex-split">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.component, value = bug.component
+ override_legal_values = bug.choices.component
+ desc_url = "describecomponents.cgi?product=$bug.product"
+ editable = bug.check_can_change_field('component', 0, 1)
+ no_tds = 1
+ %]
+ </div>
+ </div>
+ </div>
+
+ [%# #%]
+ [%# COMMENTS #%]
+ [%# #%]
+
+ <h3>Comments</h3>
+
+ [% IF user.settings.comment_box_position.value == 'before_comments' %]
+ [% PROCESS comment_box %]
+ [% END %]
+
+ <div id="comments">
+ [% PROCESS bug/comments.html.tmpl
+ comments = bug.comments
+ mode = user.id ? "edit" : "show"
+ %]
+ </div>
+
+ [% IF user.settings.comment_box_position.value == 'after_comments' %]
+ [% PROCESS comment_box %]
+ [% END %]
+ </div>
+
+ [%# ---------- SIDEBAR ---------- #%]
+
+ <div id="bug-sidebar">
+ <h3>[% terms.Bug %] #[% bug.bug_id FILTER html %]</h3>
+ [% PROCESS reporter %]
+ [% PROCESS report_dates %]
+ [% PROCESS duplicates %]
+
+ <h3>People</h3>
+ [% PROCESS assignee %]
+ [% PROCESS qa_contact %]
+ [% PROCESS cc_list %]
+ [% PROCESS ignore_bug_mail %]
+
+ <h3>Version</h3>
+ [% PROCESS version %]
+ [% PROCESS target_milestone %]
+
+ <h3>Attachments</h3>
+ [% PROCESS attachments %]
+
+ <h3>Additional information</h3>
+ <div id="sidebar-expand">
+ <a class="action-link expand" onclick="getElementById('sidebar-expand').className='expanded';this.style.display='none';">Show</a>
+ [% PROCESS platform %]
+ [% PROCESS deadline %]
+ [% PROCESS alias %]
+ [% PROCESS url %]
+ [% PROCESS keywords %]
+ [% PROCESS personal_tags %]
+ [% PROCESS dependson %]
+ [% PROCESS blockedby %]
+ [% PROCESS dependencytree %]
+ [% PROCESS see_also %]
+ [% PROCESS flags %]
+ [% PROCESS custom_fields %]
+ [% PROCESS restrict_visibility %]
+ [% PROCESS timetracking %]
+ </div>
+ </div>
+
+</div>
+</form>
+
+[%# #%]
+[%# BLOCKS #%]
+[%# #%]
+
+[%# Reporter #%]
+
+[% BLOCK reporter %]
+ <div class="field field-reporter">
+ <strong>Reported by:</strong><br />
+ [% INCLUDE global/user.html.tmpl who = bug.reporter %]<br />
+ </div>
+[% END %]
+
+[%# Reporting and modification time and history #%]
+
+[% BLOCK report_dates %]
+ <div class="field field-reportdates">
+ <strong>Reported on:</strong> [% bug.creation_ts FILTER time("%Y-%m-%d") %]<br />
+ <strong>Last modified on:</strong> [% bug.delta_ts FILTER time("%Y-%m-%d") %]
+ <a class="action-link" href="show_activity.cgi?id=[% bug.bug_id %]">Show history</a>
+ </div>
+[% END %]
+
+[%# Duplicates #%]
+
+[% BLOCK duplicates %]
+ [% IF bug.duplicates.size %]
+ <div class="field field-duplicates">
+ <b>Duplicates ([% bug.duplicates.size %]):</b>
+ <br />
+ <ul>
+ [% FOREACH dupe = bug.duplicates %]
+ <li>[% INCLUDE bug/link.html.tmpl bug = dupe, link_text = dupe.id, use_alias = 1 %] [% dupe.short_desc %]</li>
+ [% END %]
+ </ul>
+ <br />
+ <a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]" class="action-link">
+ [%-%]view as [% terms.bug %] list</a>
+ </div>
+ [% END %]
+[% END %]
+
+[%# Assignee #%]
+
+[% BLOCK assignee %]
+ <div class="field field-assignee">
+ [% can_edit_assigned_to = bug.check_can_change_field("assigned_to", 0, 1) %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.assigned_to
+ tag_name = 'b'
+ %]
+ <br />
+ [% IF can_edit_assigned_to %]
+ <div id="bz_assignee_edit_container" class="bz_default_hidden">
+ <span>
+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+ <a href="#" id="bz_assignee_edit_action" class="action-link">edit</a>
+ [% IF bug.assigned_to.id != user.id %]
+ <a title="Reassign to yourself" href="#" id="bz_assignee_take_action" class="action-link">take</a>
+ [% END %]
+ </span>
+ </div>
+ <div id="bz_assignee_input">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "assigned_to"
+ name => "assigned_to"
+ value => bug.assigned_to.login
+ classes => ["bz_userfield"]
+ size => 30
+ %]
+ <br />
+ <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
+ <label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
+ </div>
+ <script type="text/javascript">
+ hideEditableField('bz_assignee_edit_container',
+ 'bz_assignee_input',
+ 'bz_assignee_edit_action',
+ 'assigned_to',
+ '[% bug.assigned_to.login FILTER js %]' );
+ hideEditableField('bz_assignee_edit_container',
+ 'bz_assignee_input',
+ 'bz_assignee_take_action',
+ 'assigned_to',
+ '[% bug.assigned_to.login FILTER js %]',
+ '[% user.login FILTER js %]' );
+ initDefaultCheckbox('assignee');
+ </script>
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+ [% END %]
+ </div>
+[% END %]
+
+[%# QA Contact #%]
+
+[% BLOCK qa_contact %]
+ [% IF Param('useqacontact') %]
+ <div class="field field-qacontact">
+ [% can_edit_qa_contact = bug.check_can_change_field("qa_contact", 0, 1) %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.qa_contact
+ accesskey = "q", tag_name = 'b'
+ %]
+ <br />
+ [% IF can_edit_qa_contact %]
+ <div id="bz_qa_contact_edit_container" class="bz_default_hidden">
+ <span>
+ [% IF bug.qa_contact == null %]
+ Nobody
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
+ [% END %]
+ <a href="#" id="bz_qa_contact_edit_action" class="action-link">edit</a>
+ [% IF bug.qa_contact.id != user.id %]
+ <a title="Change QA contact to yourself" href="#" id="bz_qa_contact_take_action" class="action-link">take</a>
+ [% END %]
+ </span>
+ </div>
+ <div id="bz_qa_contact_input">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "qa_contact"
+ name => "qa_contact"
+ value => bug.qa_contact.login
+ size => 30
+ classes => ["bz_userfield"]
+ emptyok => 1
+ %]
+ <br />
+ <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
+ <label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label>
+ </div>
+ <script type="text/javascript">
+ hideEditableField('bz_qa_contact_edit_container',
+ 'bz_qa_contact_input',
+ 'bz_qa_contact_edit_action',
+ 'qa_contact',
+ '[% bug.qa_contact.login FILTER js %]');
+ hideEditableField('bz_qa_contact_edit_container',
+ 'bz_qa_contact_input',
+ 'bz_qa_contact_take_action',
+ 'qa_contact',
+ '[% bug.qa_contact.login FILTER js %]',
+ '[% user.login FILTER js %]');
+ initDefaultCheckbox('qa_contact');
+ </script>
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
+ [% END %]
+ </div>
+ [% END %]
+ <script type="text/javascript">
+ assignToDefaultOnChange(['product', 'component'],
+ '[% bug.component_obj.default_assignee.login FILTER js %]',
+ '[% bug.component_obj.default_qa_contact.login FILTER js %]');
+ </script>
+[% END %]
+
+[%# CC List #%]
+
+[% BLOCK cc_list %]
+ <div class="field field-cclist">
+ <b>CC List:</b>
+ <br />
+ [% IF user.id %]
+ [% IF NOT bug.cc.contains(user.login) %]
+ <input type="checkbox" id="addselfcc" name="addselfcc"
+ [% " checked=\"checked\""
+ IF user.settings.state_addselfcc.value == 'always'
+ || (!bug.user.has_any_role
+ && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
+ <label for="addselfcc">Add me to CC list</label>
+ <br />
+ [% END %]
+ [% END %]
+ [% bug.cc.size FILTER html %]
+ [% IF bug.cc.size == 1 %]
+ user
+ [% ELSE %]
+ users
+ [% END %]
+ [% IF user.id %]
+ [% IF bug.cc.contains( user.email ) %]
+ including you
+ [% END %]
+ [% END %]
+ [% IF user.id || bug.cc.size %]
+ <span id="cc_edit_area_showhide_container" class="bz_default_hidden">
+ <a href="#" id="cc_edit_area_showhide" class="action-link">[% IF user.id %]edit[% ELSE %]show[% END %]</a>
+ </span>
+ [% END %]
+ <div id="cc_edit_area">
+ [% IF user.id %]
+ <div>
+ <div><label for="cc"><b>Add</b></label></div>
+ [% INCLUDE global/userselect.html.tmpl
+ id => "newcc"
+ name => "newcc"
+ value => ""
+ size => 30
+ classes => ["bz_userfield"]
+ multiple => 5
+ %]
+ </div>
+ [% END %]
+ [% IF bug.cc.size %]
+ <select id="cc" multiple="multiple" size="5" [% 'name="cc"' IF bug.user.canedit %]>
+ [% FOREACH c = bug.cc %]
+ <option value="[% c FILTER email FILTER html %]">
+ [% c FILTER email FILTER html %]</option>
+ [% END %]
+ </select>
+ [% IF user.id && !bug.user.canedit %]
+ <input type="hidden" name="cc" value="[% user.login FILTER email FILTER html %]">
+ [% END %]
+ [% IF user.id AND (bug.user.canedit OR bug.cc.contains(user.login)) %]
+ <br />
+ <input type="checkbox" id="removecc" name="removecc">
+ <label for="removecc">
+ [% IF bug.user.canedit %]
+ Remove selected CCs
+ [% ELSE %]
+ Remove me from the CC list
+ [% END %]
+ </label>
+ <br />
+ [% END %]
+ [% END %]
+ </div>
+ [% IF user.id || bug.cc.size %]
+ <script type="text/javascript">
+ hideEditableField( 'cc_edit_area_showhide_container',
+ 'cc_edit_area',
+ 'cc_edit_area_showhide',
+ '',
+ '');
+ </script>
+ [% END %]
+ </div>
+[% END %]
+
+[%# Ignore Bug Mail #%]
+
+[% BLOCK ignore_bug_mail %]
+ [% IF user.id %]
+ <div class="field field-ignorebugmail">
+ <input type="hidden" name="defined_bug_ignored" value="1">
+ <input type="checkbox" name="bug_ignored" id="bug_ignored" value="1"
+ [% ' checked="checked"' IF user.is_bug_ignored(bug.id) %]>
+ <label for="bug_ignored" title="Ignore all email for this [% terms.bug %]">
+ <b>Ignore [% terms.Bug %] Mail</b> (never email me about this [% terms.bug %])
+ </label>
+ </div>
+ [% END %]
+[% END %]
+
+[%# Version #%]
+
+[% BLOCK version %]
+ <div class="field field-version">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.version
+ tag_name = 'b' %]
+ <br />
+ [% PROCESS select selname => "version" %]
+ </div>
+[% END %]
+
+[%# Target Milestone #%]
+
+[% BLOCK target_milestone %]
+ [% IF Param("usetargetmilestone") && bug.target_milestone %]
+ <div class="field field-targetmilestone">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.target_milestone
+ tag_name = 'b'
+ %]
+ <br />
+ [% PROCESS select selname = "target_milestone" %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# Attachments �#%]
+
+[% BLOCK attachments %]
+ <div class="field field-attachments">
+ [% PROCESS attachment/list.html.tmpl
+ attachments = bug.attachments
+ bugid = bug.bug_id
+ num_attachment_flag_types = bug.num_attachment_flag_types
+ show_attachment_flags = bug.show_attachment_flags
+ %]
+ </div>
+[% END %]
+
+[%# Platform #%]
+
+[% BLOCK platform %]
+ [% can_edit_rep_platform = bug.check_can_change_field('rep_platform', 0, 1) %]
+ <div class="field field-platform">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.rep_platform,
+ accesskey = "h", tag_name = 'b' %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.rep_platform
+ no_tds = 1, value = bug.rep_platform
+ override_legal_values = bug.choices.rep_platform
+ editable = can_edit_rep_platform %]
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.op_sys,
+ no_tds = 1, value = bug.op_sys
+ override_legal_values = bug.choices.op_sys
+ editable = bug.check_can_change_field('op_sys', 0, 1) %]
+ </div>
+[% END %]
+
+[%# Deadline #%]
+
+[% BLOCK deadline %]
+ [% IF Param("timetrackinggroup") && bug.deadline %]
+ <div class="field field-deadline">
+ <a href="page.cgi?id=fields.html#deadline">Deadline</a>:
+ </div>
+ <br />
+ [% bug.deadline FILTER html %]
+ [% END %]
+[% END %]
+
+[%# Alias #%]
+
+[% BLOCK alias %]
+ <div class="field field-alias">
+ [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.alias, tag_name = 'b' %]
+ <br />
+ [% IF bug.alias.size %]
+ [% bug.alias.join(', ') FILTER html %]
+ [% ELSE %]
+ None
+ [% END %]
+ [% IF bug.check_can_change_field('alias', 0, 1) %]
+ <span id="alias_edit_area_showhide_container" class="bz_default_hidden">
+ <a href="#" class="action-link" id="alias_edit_area_showhide">edit</a>
+ </span>
+ <br />
+ <div id="alias_edit_area">
+ <div>
+ <label for="newalias" class="field_label">Add</label>
+ <br />
+ <input name="newalias" id="newalias" size="20">
+ </div>
+ [% IF bug.alias.size %]
+ <select id="alias" name="alias" multiple="multiple" size="5">
+ [% FOREACH a = bug.alias %]
+ <option value="[% a FILTER html %]">[% a FILTER html %]</option>
+ [% END %]
+ </select>
+ <br />
+
+ <input type="checkbox" id="removealias" name="removealias">
+ <label for="removealias">Remove selected aliases</label>
+ [% END %]
+ </div>
+ <script type="text/javascript">
+ hideEditableField( 'alias_edit_area_showhide_container',
+ 'alias_edit_area',
+ 'alias_edit_area_showhide',
+ '',
+ '');
+ </script>
+ [% END %]
+ </div>
+[% END %]
+
+[%# Status Whiteboard #%]
+
+[% BLOCK status_whiteboard #%]
+ [% IF Param('usestatuswhiteboard') %]
+ <div class="field field-statuswhiteboard">
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.status_whiteboard
+ accesskey = "w", tag_name = 'b'
+ %]
+ <br />
+ [% INCLUDE input inputname = "status_whiteboard" size = 40 %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# URL #%]
+
+[% BLOCK url #%]
+ <div class="field field-url">
+ [% can_edit_bug_file_loc = bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.bug_file_loc
+ accesskey = "u", tag_name = 'b'
+ %]
+ <br />
+
+ [% IF can_edit_bug_file_loc %]
+ <span id="bz_url_edit_container" class="bz_default_hidden">
+ [% IF is_safe_url(bug.bug_file_loc) %]
+ <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
+ rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]">
+ [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
+ [% ELSE %]
+ [% bug.bug_file_loc FILTER html %]
+ [% END %]
+ <a href="#" class="action-link" id="bz_url_edit_action">edit</a></span>
+ [% END %]
+ <span id="bz_url_input_area">
+ [% url_output = INCLUDE input no_td = 1 inputname = "bug_file_loc" size = 40 %]
+ [% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1)
+ AND is_safe_url(bug.bug_file_loc) %]
+ <a href="[% bug.bug_file_loc FILTER html %]"
+ rel="noreferrer">[% url_output FILTER none %]</a>
+ [% ELSE %]
+ [% url_output FILTER none %]
+ [% END %]
+ </span>
+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <script type="text/javascript">
+ hideEditableField('bz_url_edit_container',
+ 'bz_url_input_area',
+ 'bz_url_edit_action',
+ 'bug_file_loc',
+ "[% bug.bug_file_loc FILTER js %]");
+ </script>
+ [% END %]
+ </div>
+[% END %]
+
+[%# Keywords #%]
+
+[% BLOCK keywords %]
+ [% IF use_keywords %]
+ <div class="field field-keywords">
+ [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.keywords, tag_name = 'b' %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.keywords, value = bug.keywords
+ editable = bug.check_can_change_field("keywords", 0, 1),
+ desc_url = "describekeywords.cgi", possible_values = all_keywords,
+ no_label = 1
+ %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# Personal Tags #%]
+
+[% BLOCK personal_tags %]
+ [% IF user.id %]
+ <div class="field field-personaltags">
+ [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.tag, tag_name = 'b' %]
+ <br />
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.tag, value = bug.tags.join(", "),
+ editable = 1, possible_values = user.tags.keys, no_label = 1
+ %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# Depends On #%]
+
+[% BLOCK dependson %]
+ <div class="field field-dependson">
+ [% INCLUDE dependencies
+ field = bug_fields.dependson deps = bug.depends_on_obj, tag_name = 'b' %]
+ </div>
+[% END %]
+
+[%# Blocked By #%]
+
+[% BLOCK blockedby %]
+ <div class="field field-blockedby">
+ [% INCLUDE dependencies
+ field = bug_fields.blocked deps = bug.blocks_obj, tag_name = 'b' %]
+ </div>
+[% END %]
+
+[%# Dependency tree/chart #%]
+
+[% BLOCK dependencytree %]
+ [% IF bug.dependson.size || bug.blocked.size %]
+ <div class="field field-dependencytree" id="show_dependency_tree_or_graph">
+ Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1">tree</a>
+ [% IF Param('webdotbase') %]
+ / <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a>
+ [% END %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# See Also #%]
+[% BLOCK see_also %]
+ [% IF Param('use_see_also') || bug.see_also.size %]
+ <div class="field field-seealso">
+ [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.see_also, tag_name = 'b' %]<br />
+ [% INCLUDE bug/field.html.tmpl
+ field = bug_fields.see_also
+ value = bug.see_also
+ editable = bug.check_can_change_field('see_also', 0, 1)
+ %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# Flags #%]
+
+[% BLOCK flags %]
+ [% show_bug_flags = 0 %]
+ [% bug_flags_set = 0 %]
+ [% show_more_flags = 0 %]
+ [% FOREACH type = bug.flag_types %]
+ [% IF type.flags.size || (user.id && type.is_active && user.can_request_flag(type)) %]
+ [% show_bug_flags = 1 %]
+ [% END %]
+ [% IF user.id && type.is_active && (!type.flags.size || type.is_multiplicable) %]
+ [% show_more_flags = 1 %]
+ [% END %]
+ [% IF type.flags.size %]
+ [% bug_flags_set = 1 %]
+ [% END %]
+ [% LAST IF show_bug_flags && show_more_flags && bug_flags_set %]
+ [% END %]
+ [% IF show_bug_flags %]
+ <div class="field field-flags">
+ [% IF bug.flag_types.size %]
+ [% PROCESS "flag/list.html.tmpl" flag_no_header = 1
+ flag_types = bug.flag_types
+ any_flags_requesteeble = bug.any_flags_requesteeble %]
+ [% END %]
+ [% IF show_more_flags %]
+ <span id="bz_flags_more_container" class="bz_default_hidden">
+ [% IF !bug_flags_set %]<em>None yet set</em>[% END %]
+ <a class="action-link" href="#" id="bz_flags_more_action">[% IF !bug_flags_set %]set[% ELSE %]more[% END %] flags</a>
+ </span>
+ <script type="text/javascript">
+ YAHOO.util.Dom.removeClass('bz_flags_more_container', 'bz_default_hidden');
+ var table = YAHOO.util.Dom.get("flags");
+ var rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody', table);
+ for (var i = 0; i < rows.length; i++) {
+ YAHOO.util.Dom.addClass(rows[i], 'bz_default_hidden');
+ }
+ YAHOO.util.Event.addListener('bz_flags_more_action', 'click', function (e) {
+ YAHOO.util.Dom.addClass('bz_flags_more_container', 'bz_default_hidden');
+ for (var i = 0; i < rows.length; i++) {
+ YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden');
+ }
+ YAHOO.util.Event.preventDefault(e);
+ });
+ </script>
+ [% END %]
+ </div>
+ [% END %]
+[% END %]
+
+[%# Restrict visibility %]
+
+[% BLOCK restrict_visibility %]
+ [% RETURN UNLESS bug.groups.size %]
+
+ <div class="field field-restrictvisibility">
+ <div class="bz_group_visibility_section">
+ [% inallgroups = 1 %]
+ [% inagroup = 0 %]
+ [% emitted_description = 0 %]
+
+ [% FOREACH group = bug.groups %]
+ [% SET inallgroups = 0 IF NOT group.ingroup %]
+ [% SET inagroup = 1 IF group.ison %]
+
+ [% NEXT IF group.mandatory %]
+
+ [% IF NOT emitted_description %]
+ [% emitted_description = 1 %]
+ <div id="bz_restrict_group_visibility_help">
+ <b>Only users in
+ [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %]
+ of the selected groups can view this [% terms.bug %]:</b>
+ <p class="instructions">
+ Unchecking all boxes makes this a more public [% terms.bug %].
+ </p>
+ </div>
+ [% END %]
+
+ [% IF group.ingroup %]
+ <input type="hidden" name="defined_groups"
+ value="[% group.name FILTER html %]">
+ [% END %]
+
+ <input type="checkbox" value="[% group.name FILTER html %]"
+ name="groups" id="group_[% group.bit %]"
+ [% ' checked="checked"' IF group.ison %]
+ [% ' disabled="disabled"' IF NOT group.ingroup %]>
+ <label for="group_[% group.bit %]">
+ [%- group.description FILTER html_light %]</label>
+ <br />
+ [% END %]
+
+ [% IF emitted_description %]
+ [% IF NOT inallgroups %]
+ <p class="instructions">Only members of a group can change the
+ visibility of [% terms.abug %] for that group.</p>
+ [% END %]
+ [% END %]
+
+ [% IF inagroup %]
+ <div id="bz_enable_role_visibility_help">
+ <b>Users in the roles selected below can always view
+ this [% terms.bug %]:</b>
+ </div>
+ <div id="bz_enable_role_visibility">
+ <div>
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("reporter_accessible", 0, 1)
+ %]
+ [% IF user_can_edit_accessible %]
+ <input type="hidden" name="defined_reporter_accessible" value="1">
+ [% END %]
+ <input type="checkbox" value="1"
+ name="reporter_accessible" id="reporter_accessible"
+ [% " checked" IF bug.reporter_accessible %]
+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+ <label for="reporter_accessible">Reporter</label>
+ </div>
+ <div>
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("cclist_accessible", 0, 1)
+ %]
+ [% IF user_can_edit_accessible %]
+ <input type="hidden" name="defined_cclist_accessible" value="1">
+ [% END %]
+ <input type="checkbox" value="1"
+ name="cclist_accessible" id="cclist_accessible"
+ [% " checked" IF bug.cclist_accessible %]
+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+ <label for="cclist_accessible">CC List</label>
+ </div>
+ <p class="instructions">
+ The assignee
+ [% IF (Param('useqacontact')) %]
+ and QA contact
+ [% END %]
+ can always see [% terms.abug %], and this section does not
+ take effect unless the [% terms.bug %] is restricted to at
+ least one group.
+ </p>
+ </div>
+ [% END %]
+ </div> [%# bz_group_visibility_section %]
+ </div>
+[% END %]
+
+[%# Time Tracking #%]
+
+[% BLOCK timetracking %]
+ [% IF user.is_timetracker %]
+ <div class="field field-timetracking"
+ <table class="bz_time_tracking_table">
+ <tr>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.estimated_time
+ %]
+ <th>
+ Current Est.:
+ </th>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.work_time
+ %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.remaining_time
+ %]
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.percentage_complete
+ %]
+ <th>
+ Gain:
+ </th>
+ [% INCLUDE "bug/field-label.html.tmpl"
+ field = bug_fields.deadline
+ %]
+ </tr>
+ <tr>
+ <td>
+ <input name="estimated_time" id="estimated_time"
+ value="[% PROCESS formattimeunit
+ time_unit=bug.estimated_time %]"
+ size="6" maxlength="6">
+ </td>
+ <td>
+ [% PROCESS formattimeunit
+ time_unit=(bug.actual_time + bug.remaining_time) %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit time_unit=bug.actual_time %] +
+ <input name="work_time" id="work_time"
+ value="0" size="3" maxlength="6"
+ onchange="adjustRemainingTime();">
+ </td>
+ <td>
+ <input name="remaining_time" id="remaining_time"
+ value="[% PROCESS formattimeunit
+ time_unit=bug.remaining_time %]"
+ size="6" maxlength="6" onchange="updateRemainingTime();">
+ </td>
+ <td>
+ [% PROCESS calculatepercentage act=bug.actual_time
+ rem=bug.remaining_time %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
+ </td>
+ <td>
+ [% INCLUDE bug/field.html.tmpl
+ field = bug_fields.deadline, value = bug.deadline, no_tds = 1
+ editable = bug.check_can_change_field('deadline', 0, 1) %]
+ </td>
+ </tr>
+ <tr>
+ <td colspan="7" class="bz_summarize_time">
+ <a href="summarize_time.cgi?id=[% bug.bug_id %]&do_depends=1">
+ Summarize time (including time for [% terms.bugs %]
+ blocking this [% terms.bug %])</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ [% END %]
+[% END %]
+
+[%# Custom fields #%]
+
+[% BLOCK custom_fields %]
+ [% USE Bugzilla %]
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ <div class="field field.[% field.name FILTER html %]">
+ [%# Use PROCESS instead of INCLUDE, because extra_field_item is defined
+ # in the template and must be returned back. INCLUDE cannot do that. %]
+ [% PROCESS bug/field.html.tmpl value = bug.${field.name}
+ editable = bug.check_can_change_field(field.name, 0, 1) %]
+ [% IF extra_field_item %]
+ <br />
+ <strong>[% extra_field_item.header FILTER none %]</strong>
+ <br />
+ [% extra_field_item.data FILTER none %]
+ [% END %]
+ </div>
+ [% END %]
+ [% Hook.process("after_custom_fields") %]
+[% END %]
+
+
+[%# TBD #%]
+
+[%############################################################################%]
+[%# Block for the Additional Comments box #%]
+[%############################################################################%]
+
+[% BLOCK comment_box %]
+ <div id="add_comment" class="bz_section_additional_comments">
+ [% IF user.id %]
+<!-- <label for="comment" accesskey="c"><b>Additional
+ <u>C</u>omments</b></label>: -->
+
+ [% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
+ <input type="checkbox" name="comment_is_private" value="1"
+ id="newcommentprivacy"
+ onClick="updateCommentTagControl(this, 'comment')">
+ <label for="newcommentprivacy">
+ Make comment private (visible only to members of the
+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+ [% END %]
+
+ <!-- This table keeps the submit button aligned with the box. -->
+ <table><tr><td>
+ [% IF bug.check_can_change_field('longdesc', 0, 1) %]
+ [% INCLUDE bug/comment.html.tmpl
+ minrows = 10
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+ %]
+ [% IF user.is_insider %]
+ <script>
+ updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
+ </script>
+ [% END %]
+ [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
+ [% ELSE %]
+ You are not allowed to make an additional comment on this [% terms.bug %].
+ [% END %]
+ [% PROCESS commit_button id=""%]
+
+ [% Hook.process("after_comment_commit_button", 'bug/edit.html.tmpl') %]
+
+ </td></tr></table>
+
+ [%# For logged-out users %]
+ [% ELSE %]
+ <table>
+ <tr>
+ <td>
+ <fieldset>
+ <legend>Note</legend>
+ You need to
+ <a href="show_bug.cgi?id=
+ [%- bug.bug_id %]&GoAheadAndLogIn=1">log in</a>
+ before you can comment on or make changes to this [% terms.bug %].
+ </fieldset>
+ </td>
+ </tr>
+ </table>
+ [% END %]
+ </div>
+[% END %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ [% IF bug.check_can_change_field(selname, 0, 1)
+ AND bug.choices.${selname}.size > 1 %]
+ <input type="hidden" id="[% selname %]_dirty">
+ <select id="[% selname %]" name="[% selname %]">
+ [% FOREACH x = bug.choices.${selname} %]
+ <option value="[% x.name FILTER html %]"
+ [% " selected" IF x.name == bug.${selname} %]>
+ [%- x.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ [% bug.${selname} FILTER html %]
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for INPUT fields #%]
+[%############################################################################%]
+
+[% BLOCK input %]
+ [% IF no_td != 1 %]
+ <td[% " colspan=\"$colspan\"" IF colspan %]>
+ [% END %]
+ [% val = value ? value : bug.$inputname %]
+ [% IF bug.check_can_change_field(inputname, 0, 1) %]
+ <input id="[% inputname %]" name="[% inputname %]" class="text_input"
+ value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
+ [% " maxlength=\"$maxlength\"" IF maxlength %]
+ [% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
+ [% ELSE %]
+ [% IF size && val.length > size %]
+ <span title="[% val FILTER html %]">
+ [% val FILTER truncate(size) FILTER html %]
+ </span>
+ [% ELSE %]
+ [% val FILTER html %]
+ [% END %]
+ [% END %]
+ [% IF no_td != 1 %]
+ </td>
+ [% END %]
+ [% no_td = 0 %]
+ [% maxlength = 0 %]
+ [% colspan = 0 %]
+ [% size = 0 %]
+ [% value = undef %]
+ [% spellcheck = undef %]
+[% END %]
+
+[%# Commit button... %]
+[% BLOCK commit_button %]
+ [% IF user.id %]
+ <div class="knob-buttons">
+ [% IF id == '_top' && bug.check_can_change_field('short_desc', 0, 1) %]
+ <a href="#" id="summary_edit_action" class="action-link">Edit title</a>
+ [% END %]
+ <input type="submit" value="Save Changes"
+ id="commit[% id FILTER css_class_quote %]">
+ </div>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for dependencies #%]
+[%############################################################################%]
+
+[% BLOCK dependencies %]
+
+ [% INCLUDE "bug/field-label.html.tmpl" %]
+
+ <td>
+ <span id="[% field.name FILTER html %]_input_area">
+ [% IF bug.check_can_change_field(field.name, 0, 1) %]
+ <input name="[% field.name FILTER html %]"
+ id="[% field.name FILTER html %]" class="text_input"
+ value="[% bug.${field.name}.join(', ') FILTER html %]">
+ [% END %]
+ </span>
+
+ [% FOREACH dep_bug = deps %]
+ [% INCLUDE bug/link.html.tmpl bug = dep_bug, link_text = dep_bug.id, use_alias = 1 %][% " " %]
+ [% END %]
+ [% IF bug.check_can_change_field(field.name, 0, 1) %]
+ <span id="[% field.name FILTER html %]_edit_container"
+ class="edit_me bz_default_hidden">
+ (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>)
+ </span>
+ <script type="text/javascript">
+ hideEditableField('[% field.name FILTER js %]_edit_container',
+ '[% field.name FILTER js %]_input_area',
+ '[% field.name FILTER js %]_edit_action',
+ '[% field.name FILTER js %]',
+ '[% bug.${field.name}.join(', ') FILTER js %]');
+ </script>
+ [% END %]
+ </td>
+
+[% END %]
+
diff --git a/template/en/custom/bug/field.html.tmpl b/template/en/custom/bug/field.html.tmpl
new file mode 100644
index 0000000..02806cd
--- /dev/null
+++ b/template/en/custom/bug/field.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'bug/field_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'bug/field_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/field_DEFAULT.html.tmpl b/template/en/custom/bug/field_DEFAULT.html.tmpl
new file mode 120000
index 0000000..1587a55
--- /dev/null
+++ b/template/en/custom/bug/field_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/field.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/field_XFCE.html.tmpl b/template/en/custom/bug/field_XFCE.html.tmpl
new file mode 100644
index 0000000..edf0818
--- /dev/null
+++ b/template/en/custom/bug/field_XFCE.html.tmpl
@@ -0,0 +1,294 @@
+[%# 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: a Bugzilla::Field object
+ # value: The value of the field for this bug.
+ # field_hidden (optional): boolean; if true, the field is hidden by default.
+ # override_legal_values (optional): The list of legal values, for select fields.
+ # editable: Whether the field should be displayed as an editable
+ # <input> or as just the plain text of its value.
+ # allow_dont_change: display the --do_not_change-- option for select fields.
+ # value_span: A colspan for the table cell containing
+ # the field value.
+ # no_tds: boolean; if true, don't display the label <th> or the
+ # wrapping <td> for the field.
+ # bug (optional): The current Bugzilla::Bug being displayed, or a hash
+ # with default field values being displayed on a page.
+ # no_label: boolean; if true, don't display the label
+ #%]
+
+[% IF NOT no_tds %]
+ [% field_hidden = 0 %]
+ [% IF bug AND !field.is_visible_on_bug(bug) %]
+ [% field_hidden = 1 %]
+ [% END %]
+
+ [% IF no_label != 1 %]
+ [% INCLUDE "bug/field-label.html.tmpl" hidden = field_hidden %]
+ [% END %]
+ <td class="field_value [% ' bz_hidden_field' IF field_hidden %]"
+ id="field_container_[% field.name FILTER html %]"
+ [% " colspan=\"$value_span\"" FILTER none IF value_span %]>
+[% END %]
+[% Hook.process('start_field_column') %]
+[% IF editable %]
+ [% SWITCH field.type %]
+ [% CASE [ constants.FIELD_TYPE_FREETEXT
+ constants.FIELD_TYPE_INTEGER ] %]
+ <input id="[% field.name FILTER html %]" class="text_input"
+ name="[% field.name FILTER html %]"
+ value="[% value FILTER html %]" size="40"
+ maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"
+ [% IF field.type == constants.FIELD_TYPE_INTEGER %]
+ pattern="-?\d+[% IF dontchange %]|[% dontchange FILTER html %][% END %]"
+ title="The value must be a valid positive or negative integer"
+ [% END %]
+ [% IF field.is_mandatory %]
+ data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+ [% END %]>
+ [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
+ [% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %]
+ <input name="[% field.name FILTER html %]" size="[% size FILTER none %]"
+ id="[% field.name FILTER html %]"
+ value="[% value FILTER html %]"
+ [% IF field.is_mandatory %]
+ data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+ [% END %]
+ onchange="updateCalendarFromField(this)">
+ <button type="button" class="calendar_button"
+ id="button_calendar_[% field.name FILTER html %]"
+ onclick="showCalendar('[% field.name FILTER js %]')">
+ <span>Calendar</span>
+ </button>
+
+ <div id="con_calendar_[% field.name FILTER html %]"></div>
+
+ <script type="text/javascript">
+ <!--
+ [%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
+ //--></script>
+ [% CASE constants.FIELD_TYPE_BUG_ID %]
+ <span id="[% field.name FILTER html %]_input_area">
+ <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
+ value="[% value FILTER html %]" size="7"
+ [% IF field.is_mandatory %]
+ data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+ [% END %]>
+ </span>
+
+ [% IF value %]
+ [% value FILTER bug_link(value, use_alias => 1) FILTER none %]
+ [% END %]
+ <span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
+ <a href="#" id="[% field.name FILTER html %]_edit_action" class="action-link">edit</a>
+ </span>
+ <script type="text/javascript">
+ hideEditableField('[% field.name FILTER js %]_edit_container',
+ '[% field.name FILTER js %]_input_area',
+ '[% field.name FILTER js %]_edit_action',
+ '[% field.name FILTER js %]',
+ "[% value FILTER js %]");
+ </script>
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
+ constants.FIELD_TYPE_MULTI_SELECT ] %]
+ [%# The 'product' field needs its own template if classifications are enabled. %]
+ [% IF field.name == "product" AND Param('useclassification') %]
+ [% INCLUDE "global/product-select.html.tmpl"
+ id = "product", name = "product", value = value
+ products = override_legal_values %]
+ [% ELSE %]
+ <input type="hidden" id="[% field.name FILTER html %]_dirty">
+ <select id="[% field.name FILTER html %]"
+ name="[% field.name FILTER html %]"
+ [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+ [% SET field_size = 5 %]
+ [% IF field.legal_values.size < 5 %]
+ [% SET field_size = field.legal_values.size %]
+ [% END %]
+ size="[% field_size FILTER html %]" multiple="multiple"
+ [% IF field.is_mandatory %]
+ data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
+ [% END %]
+ [% END %]>
+ [% IF allow_dont_change %]
+ <option value="[% dontchange FILTER html %]"
+ [% ' selected="selected"' IF value == dontchange %]>
+ [% dontchange FILTER html %]
+ </option>
+ [% END %]
+ [% IF override_legal_values %]
+ [% legal_values = override_legal_values %]
+ [% ELSE %]
+ [% legal_values = field.legal_values %]
+ [% END %]
+ [% FOREACH legal_value = legal_values %]
+ [% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %]
+ <option value="[% legal_value.name FILTER html %]"
+ id="v[% legal_value.id FILTER html %]_
+ [%- field.name FILTER html %]"
+ [%# We always show selected values, even if they should be
+ # hidden %]
+ [% IF value.contains(legal_value.name).size %]
+ selected="selected"
+ [% ELSIF bug AND !legal_value.is_visible_on_bug(bug) %]
+ class="bz_hidden_option" disabled="disabled"
+ [% END %]>
+ [%- display_value(field.name, legal_value.name) FILTER html ~%]
+ </option>
+ [% END %]
+ </select>
+ [%# When you pass an empty multi-select in the web interface,
+ # it doesn't appear at all in the CGI object. Instead of
+ # forcing all users of process_bug to always specify every
+ # multi-select, we have this field defined if the multi-select
+ # field is defined, and then if this is passed but the multi-select
+ # isn't, we know that the multi-select was emptied.
+ %]
+ [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+ <input type="hidden" name="defined_[% field.name FILTER html %]">
+ [% END %]
+ [% END %]
+
+ <script type="text/javascript">
+ <!--
+ initHidingOptionsForIE('[% field.name FILTER js %]');
+ [%+ INCLUDE "bug/field-events.js.tmpl"
+ field = field, product = bug.product_obj %]
+ //-->
+ </script>
+
+ [% CASE constants.FIELD_TYPE_TEXTAREA %]
+ <div id="[% field.name FILTER html %]_edit_container" class="bz_default_hidden">
+ <div>
+ <a href="#" id="[% field.name FILTER html %]_edit_action" class="action-link">edit</a>
+ </div>
+ [% IF value %]
+ <pre id="[% field.name FILTER html %]_readonly"
+ class="field_textarea_readonly">[% value FILTER html %]</pre>
+ [% END %]
+ </div>
+ <div id="[% field.name FILTER html %]_input">
+ [% INCLUDE global/textarea.html.tmpl
+ id = field.name name = field.name minrows = 4 maxrows = 8
+ cols = 60 defaultcontent = value mandatory = field.is_mandatory %]
+ </div>
+ <script type="text/javascript">
+ hideEditableField('[% field.name FILTER js %]_edit_container',
+ '[% field.name FILTER js %]_input',
+ '[% field.name FILTER js %]_edit_action',
+ '[% field.name FILTER js %]',
+ '[% value FILTER js %]',
+ '',
+ true);
+ </script>
+ [% CASE constants.FIELD_TYPE_BUG_URLS %]
+ [% IF bug.id && value.size %]
+ <ul class="bug_urls">
+ [% FOREACH bug_url = value %]
+ <li>
+ [% PROCESS bug_url_link bug_url = bug_url %]
+ <label><input type="checkbox" value="[% bug_url.name FILTER html %]"
+ name="remove_[% field.name FILTER html %]">
+ Remove</label>
+ </li>
+ [% END %]
+ </ul>
+ [% END %]
+ [% IF Param('use_see_also') %]
+ <span id="container_showhide_[% field.name FILTER html %]"
+ class="bz_default_hidden">
+ <a href="#" id="showhide_[% field.name FILTER html %]" class="action-link">add</a>
+ </span>
+ <div id="container_[% field.name FILTER html %]">
+ <input type="text" id="[% field.name FILTER html %]" size="40"
+ class="text_input" name="[% field.name FILTER html %]"
+ [% IF !bug.id %]value="[% value FILTER html %]"[% END %]>
+ </div>
+ [% IF bug.id %]
+ <script type="text/javascript">
+ setupEditLink('[% field.name FILTER js %]');
+ </script>
+ [% END %]
+ [% END %]
+ [% CASE constants.FIELD_TYPE_KEYWORDS %]
+ <div id="[% field.name FILTER html %]_container">
+ <input type="text" id="[% field.name FILTER html %]" size="40"
+ class="text_input" name="[% field.name FILTER html %]"
+ value="[% value FILTER html %]">
+ <div id="[% field.name FILTER html %]_autocomplete"></div>
+ </div>
+ <script type="text/javascript">
+ if (typeof YAHOO.bugzilla.field_array === "undefined")
+ YAHOO.bugzilla.field_array = [];
+ YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [
+ [%- FOREACH val = possible_values %]
+ [%-# %]"[% val FILTER js %]"
+ [%- "," IF NOT loop.last %][% END %]];
+ YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
+ '[% field.name FILTER js %]_autocomplete');
+ </script>
+ [% END %]
+[% ELSE %]
+ [% SWITCH field.type %]
+ [% CASE constants.FIELD_TYPE_TEXTAREA %]
+ <div class="uneditable_textarea">[% value FILTER html %]</div>
+ [% CASE constants.FIELD_TYPE_BUG_ID %]
+ [% IF value %]
+ [% value FILTER bug_link(value, use_alias => 1) FILTER none %]
+ [% END %]
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
+ constants.FIELD_TYPE_MULTI_SELECT ] %]
+ <span class="select">
+ [% FOREACH val = value %]
+ [% display_value(field.name, val) FILTER html %]
+ [% ', ' UNLESS loop.last() %]
+ [% END %]
+ </span>
+ [% CASE constants.FIELD_TYPE_BUG_URLS %]
+ [% '<ul class="bug_urls">' IF value.size %]
+ [% FOREACH bug_url = value %]
+ <li>
+ [% PROCESS bug_url_link bug_url = bug_url %]
+ </li>
+ [% END %]
+ [% '</ul>' IF value.size %]
+ [% CASE %]
+ [% value.join(', ') FILTER html %]
+ [% END %]
+[% END %]
+
+[% IF bug && field.name == 'component' %]
+ <a href="buglist.cgi?component=[% bug.component FILTER uri %]&product=[% bug.product FILTER uri %]&bug_status=__open__"
+ target="_blank" class="action-link">Show other [% terms.bugs %]</a>
+[% END %]
+
+[% Hook.process('end_field_column') %]
+[% '</td>' IF NOT no_tds %]
+
+[%# for reverse relationships, we show this pseudo-field after the main field %]
+[% IF bug.id && field.is_relationship %]
+ [% extra_field_item = {} %]
+ [% extra_field_item.header = field.reverse_desc _ ":" FILTER html %]
+ [% extra_field_item.data = BLOCK %]
+ [% FOREACH depbug = bug.related_bugs(field) %]
+ [% depbug.id FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %]
+ [% END %]
+ [% END %]
+[% ELSE %]
+ [% extra_field_item = '' %]
+[% END %]
+
+[% BLOCK bug_url_link %]
+ [% IF bug_url.isa('Bugzilla::BugUrl::Bugzilla::Local') %]
+ [% bug_url.target_bug_id FILTER bug_link(bug_url.target_bug_id, use_alias => 1) FILTER none %]
+ [% ELSE %]
+ <a href="[% bug_url.name FILTER html %]">
+ [% bug_url.name FILTER html %]</a>
+ [% END %]
+[% END %]
diff --git a/template/en/custom/bug/knob.html.tmpl b/template/en/custom/bug/knob.html.tmpl
new file mode 100644
index 0000000..08e43df
--- /dev/null
+++ b/template/en/custom/bug/knob.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'bug/knob_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'bug/knob_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/knob_DEFAULT.html.tmpl b/template/en/custom/bug/knob_DEFAULT.html.tmpl
new file mode 120000
index 0000000..dd89fea
--- /dev/null
+++ b/template/en/custom/bug/knob_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/knob.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/knob_XFCE.html.tmpl b/template/en/custom/bug/knob_XFCE.html.tmpl
new file mode 100644
index 0000000..7976fb3
--- /dev/null
+++ b/template/en/custom/bug/knob_XFCE.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.
+ #%]
+
+<div class="flex-split">
+ [% IF bug.choices.bug_status.size > 1 && bug.check_can_change_field('resolution', bug.resolution, 1) %]
+ <select id="status_resolution" name="status_resolution">
+ [% FOREACH status = bug.choices.bug_status %]
+ [% IF status.name == 'RESOLVED' %]
+ [% FOREACH resolution = bug.choices.resolution %]
+ <option value="RESOLVED-[% resolution.name FILTER html %]"
+ [% IF bug.resolution.contains(resolution.name).size %]
+ selected="selected"
+ [% ELSIF bug AND !resolution.is_visible_on_bug(bug) %]
+ class="bz_hidden_option" disabled="disabled"
+ [% END %]>
+ [% status.name FILTER html %]: [% resolution.name FILTER html %] [% IF resolution.name == 'DUPLICATE' %]...[% END %]</option>
+ [% END %]
+ [% ELSE %]
+ <option value="[% status.name FILTER html %]"
+ [% IF bug.bug_status.contains(status.name).size %]
+ selected="selected"
+ [% ELSIF bug AND !status.is_visible_on_bug(bug) %]
+ class="bz_hidden_option" disabled="disabled"
+ [% END %]>
+ [% status.name FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </select>
+ [% ELSE %]
+ <span class="select">
+ [% bug.bug_status FILTER html %][% IF bug.resolution %]: [% bug.resolution FILTER html %][% END %]
+ </span>
+ [% END %]
+
+ <input id="dup_id" name="dup_id" size="6" value="[% bug.dup_id FILTER html %]" placeholder="[% terms.bug %] #" style="display: none;"
+ [% IF !bug.check_can_change_field('dup_id', 0, 1) %]
+ disabled="disabled"
+ [% END %]
+ />
+
+ <input type="hidden" name="bug_status" id="bug_status" value="[% bug.bug_status %]" />
+ <input type="hidden" name="resolution" id="resolution" value="[% bug.bug_resolution %]" />
+</div>
+
+<script type="text/javascript">
+ var strs = document.getElementById('status_resolution');
+ var strs_opt = strs.options[strs.selectedIndex];
+ strs.className = strs_opt.value;
+
+ [% IF bug.dup_id && bug.resolution == 'DUPLICATE' %]
+ document.getElementById('dup_id').style.display = 'inline';
+ [% END %]
+
+ strs.addEventListener('change', function() {
+ var strs_opt = strs.options[strs.selectedIndex];
+ var strs_value = strs_opt.value.split('-');
+ if( strs_value.length == 1 ) {
+ if( strs_value[0] == 'VERIFIED' || strs_value[0] == 'CLOSED' ) {
+ strs_value[1] = 'FIXED';
+ } else {
+ strs_value[1] = '';
+ }
+ }
+
+ document.getElementById('bug_status').value = strs_value[0];
+ document.getElementById('resolution').value = strs_value[1];
+ strs.className = strs_opt.value;
+
+ if( strs_value[1] == 'DUPLICATE' ) {
+ document.getElementById('dup_id').style.display = 'block';
+ } else {
+ document.getElementById('dup_id').style.display = 'none';
+ }
+ });
+</script>
+<noscript>
+ [% PROCESS bug/field.html.tmpl
+ no_tds = 1
+ field = bug_fields.bug_status
+ value = bug.bug_status
+ override_legal_values = bug.choices.bug_status
+ editable = bug.choices.bug_status.size > 1
+ %]
+ [% PROCESS bug/field.html.tmpl
+ no_tds = 1
+ field = bug_fields.resolution
+ value = bug.resolution
+ override_legal_values = bug.choices.resolution
+ editable = bug.check_can_change_field('resolution', bug.resolution, 1)
+ %]
+
+ <input id="dup_id" name="dup_id" size="6" value="[% bug.dup_id FILTER html %]" placeholder="[% terms.bug %] #"
+ [% IF !bug.check_can_change_field('dup_id', 0, 1) %]
+ disabled="disabled"
+ [% END %]
+ />
+</noscript>
diff --git a/template/en/custom/bug/navigate.html.tmpl b/template/en/custom/bug/navigate.html.tmpl
new file mode 100644
index 0000000..f1f5def
--- /dev/null
+++ b/template/en/custom/bug/navigate.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'bug/navigate_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'bug/navigate_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/navigate_DEFAULT.html.tmpl b/template/en/custom/bug/navigate_DEFAULT.html.tmpl
new file mode 120000
index 0000000..244ac19
--- /dev/null
+++ b/template/en/custom/bug/navigate_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/navigate.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/navigate_XFCE.html.tmpl b/template/en/custom/bug/navigate_XFCE.html.tmpl
new file mode 100644
index 0000000..dbf2145
--- /dev/null
+++ b/template/en/custom/bug/navigate_XFCE.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.
+ #%]
+
+[% RETURN IF !bug %]
+
+[% SET my_search = user.recent_search_for(bug) %]
+
+<div class="navigation">
+ [% IF my_search %]
+ <div class="nav_left">
+ [% SET last_bug_list = my_search.bug_list %]
+ [% SET this_bug_idx = lsearch(last_bug_list, bug.id) %]
+ <b>[% terms.Bug %] List:</b>
+
+ ([% this_bug_idx + 1 %] of [% last_bug_list.size %])
+
+ [% IF this_bug_idx > 0 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.first FILTER uri %]&list_id=
+ [%- my_search.id FILTER uri %]">First</a>
+ [% ELSE %]
+ <span class="navigation_link">First</span>
+ [% END %]
+
+ [% IF this_bug_idx + 1 < last_bug_list.size %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.last FILTER uri %]&list_id=
+ [%- my_search.id FILTER uri %]">Last</a>
+ [% ELSE %]
+ <span class="navigation_link">Last</span>
+ [% END %]
+
+ [% IF this_bug_idx > 0 %]
+ [% prev_bug = this_bug_idx - 1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.$prev_bug FILTER uri %]&list_id=
+ [%- my_search.id FILTER uri %]">Prev</a>
+ [% ELSE %]
+ <span class="navigation_link">Prev</span>
+ [% END %]
+
+ [% IF this_bug_idx + 1 < last_bug_list.size %]
+ [% next_bug = this_bug_idx + 1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.$next_bug FILTER uri %]&list_id=
+ [%- my_search.id FILTER uri %]">Next</a>
+ [% ELSE %]
+ <span class="navigation_link">Next</span>
+ [% END %]
+
+ <a href="buglist.cgi?regetlastlist=
+ [%- my_search.id FILTER uri %]">Show last search results</a>
+ </div>
+ [% END %]
+
+ <div class="nav_right">
+ <b>All [% terms.Bugs %]:</b>
+ <a href="buglist.cgi?component=[% bug.component FILTER uri %]&product=[% bug.product FILTER uri %]&bug_status=__open__">This component</a>
+ <a href="buglist.cgi?product=[% bug.product FILTER uri %]&bug_status=__open__">This product</a>
+ </div>
+</div>
diff --git a/template/en/custom/bug/show.html.tmpl b/template/en/custom/bug/show.html.tmpl
new file mode 100644
index 0000000..3f668ee
--- /dev/null
+++ b/template/en/custom/bug/show.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'bug/show_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'bug/show_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/bug/show_DEFAULT.html.tmpl b/template/en/custom/bug/show_DEFAULT.html.tmpl
new file mode 120000
index 0000000..aea9f73
--- /dev/null
+++ b/template/en/custom/bug/show_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/bug/show.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/bug/show_XFCE.html.tmpl b/template/en/custom/bug/show_XFCE.html.tmpl
new file mode 100644
index 0000000..be30805
--- /dev/null
+++ b/template/en/custom/bug/show_XFCE.html.tmpl
@@ -0,0 +1,30 @@
+[%# 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.
+ #%]
+
+[%# This script/template only handles one bug #%]
+[% bug = bugs.0 %]
+
+[% IF !header_done %]
+ [% PROCESS "bug/show-header.html.tmpl" %]
+ [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+[% IF nextbug %]
+ <hr>
+ <p>
+ The next [% terms.bug %] in your list is [% terms.bug %]
+ <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>:
+ </p>
+ <hr>
+[% END %]
+
+[% PROCESS bug/navigate.html.tmpl %]
+
+[% PROCESS bug/edit.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/custom/global/banner.html.tmpl b/template/en/custom/global/banner.html.tmpl
new file mode 100644
index 0000000..f78c106
--- /dev/null
+++ b/template/en/custom/global/banner.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.
+ #%]
+
+[%# Migration note: this file corresponds to the old Param 'bannerhtml' %]
+
+<div id="xfce-header">
+ <div>
+ <h1 id="xfce-header-title">Xfce Bug Tracker</h1>
+ <h5 id="xfce-header-subtitle">Sub domains</h5>
+
+ <ul>
+ <li><a href="http://www.xfce.org" title="Go to the homepage">Home</a></li>
+ <li><a href="http://docs.xfce.org" title="Official documentation">Docs</a></li>
+ <li><a href="http://archive.xfce.org" title="Download location of tarballs">Archive</a></li>
+ <li><a href="http://wiki.xfce.org" title="Community documentation">Wiki</a></li>
+ <li><a href="http://forum.xfce.org" title="Community forums">Forum</a></li>
+ <li><a href="https://bugzilla.xfce.org" title="Report and track bugs" class="active">Bugs</a></li>
+ <li><a href="http://blog.xfce.org" title="Visit the blog">Blog</a></li>
+ <li><a href="http://www.xfce.org/getinvolved/translation" title="Help translating the Xfce project">Translate</a></li>
+ <li><a href="http://git.xfce.org" title="Project repositories">GIT</a></li>
+ </ul>
+ </div>
+ <div id="xfce-header-clear"></div>
+</div>
diff --git a/template/en/custom/global/choose-product.html.tmpl b/template/en/custom/global/choose-product.html.tmpl
new file mode 100644
index 0000000..2a24f8a
--- /dev/null
+++ b/template/en/custom/global/choose-product.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'global/choose-product_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'global/choose-product_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/choose-product_DEFAULT.html.tmpl b/template/en/custom/global/choose-product_DEFAULT.html.tmpl
new file mode 120000
index 0000000..ed5d9ea
--- /dev/null
+++ b/template/en/custom/global/choose-product_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/choose-product.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/choose-product_XFCE.html.tmpl b/template/en/custom/global/choose-product_XFCE.html.tmpl
new file mode 100644
index 0000000..007a672
--- /dev/null
+++ b/template/en/custom/global/choose-product_XFCE.html.tmpl
@@ -0,0 +1,73 @@
+[%# INTERFACE:
+ # classifications: array of hashes, with an 'object' key representing a
+ # classification object and 'products' the list of
+ # product objects the user can enter bugs into.
+ # target: the script that displays this template.
+ #%]
+
+[% IF target == "enter_bug.cgi" %]
+ [% title = "Enter $terms.Bug" %]
+ [% subheader = "Select Product" %]
+ [% h2 = BLOCK %]
+ [% IF Param('useclassification') %]Next[% ELSE %]First[% END %],
+ you must pick a product (and component) on which to enter [% terms.abug %]:
+ [% END %]
+[% ELSIF target == "describecomponents.cgi" %]
+ [% title = "Browse" %]
+ [% h2 = "Select a product category to browse:" %]
+[% END %]
+
+[% DEFAULT title = "Choose a Product" %]
+[% PROCESS global/header.html.tmpl %]
+
+[% USE Bugzilla %]
+[% previous_params = Bugzilla.cgi.canonicalise_query('classification', 'product') %]
+
+<h2>[% h2 FILTER html %]</h2>
+
+[% IF target == 'describecomponents.cgi' %]
+ <ul class="product_categories">
+ [% FOREACH c = classifications %]
+ [% IF c.object %]
+ <li><a class="action-link" href="#cat-[% c.object.id %]">[% c.object.name FILTER html %]</a></li>
+ [% END %]
+ [% END %]
+ </ul>
+ <hr />
+[% END %]
+
+[% IF target == "describecomponents.cgi" %][% url_base = "buglist.cgi" %][% ELSE %][% url_base = target %][% END %]
+
+[% FOREACH c = classifications %]
+ [% IF c.object %]
+ <h3 class="product_cat" id="cat-[% c.object.id %]">[% c.object.name FILTER html %]</h3>
+ <p>[% c.object.description FILTER html %]</p>
+ [% END %]
+
+ <ul class="products">
+ [% FOREACH p = c.products %]
+ <li>
+ <strong>
+ [% p.name FILTER html %]
+ </strong>
+ <div>
+ [% p.description FILTER html %]<br />
+ <span class="product_components">
+ [% IF target == 'describecomponents.cgi' && p.components.size > 1 %]
+ <a class="component-all" href="[% url_base %]?product=[% p.name FILTER uri %]&resolution=---[% IF previous_params %]&[% previous_params FILTER none %][% END %]">All components</a>
+ [% END %]
+ [% IF p.components.size == 1 %]
+ <a href="[% url_base %]?product=[% p.name FILTER uri %]&component=[% p.components.item(0).name FILTER uri %]&resolution=---[% IF previous_params %]&[% previous_params FILTER none %][% END %]">[% p.name %]</a>
+ [% ELSE %]
+ [% FOREACH comp = p.components %]
+ <a class="component-[% comp.name FILTER uri %]" href="[% url_base %]?product=[% p.name FILTER uri %]&component=[% comp.name FILTER uri %]&resolution=---[% IF previous_params %]&[% previous_params FILTER none %][% END %]">[% comp.name %]</a>
+ [% END %]
+ [% END %]
+ </span>
+ </div>
+ </li>
+ [% END %]
+ </ul>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/custom/global/common-links.html.tmpl b/template/en/custom/global/common-links.html.tmpl
new file mode 100644
index 0000000..bc933b5
--- /dev/null
+++ b/template/en/custom/global/common-links.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'global/common-links_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'global/common-links_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/common-links_DEFAULT.html.tmpl b/template/en/custom/global/common-links_DEFAULT.html.tmpl
new file mode 120000
index 0000000..38dff31
--- /dev/null
+++ b/template/en/custom/global/common-links_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/common-links.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/common-links_XFCE.html.tmpl b/template/en/custom/global/common-links_XFCE.html.tmpl
new file mode 100644
index 0000000..4025baa
--- /dev/null
+++ b/template/en/custom/global/common-links_XFCE.html.tmpl
@@ -0,0 +1,110 @@
+[% DEFAULT qs_suffix = "" %]
+[% USE Bugzilla %]
+
+<ul class="links links-primary">
+ <li><a href="./">Home</a></li>
+ <li><a href="enter_bug.cgi">New</a></li>
+ <li><a href="describecomponents.cgi">Browse</a></li>
+ <li><a href="query.cgi">Search</a></li>
+
+ <li class="form">
+ <form action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '')
+ { alert('Please enter one or more search terms first.');
+ return false; } return true;">
+ <input type="hidden" id="no_redirect[% qs_suffix FILTER html %]" name="no_redirect" value="0">
+ <script type="text/javascript">
+ if (history && history.replaceState) {
+ var no_redirect = document.getElementById("no_redirect[% qs_suffix FILTER js %]");
+ no_redirect.value = 1;
+ }
+ </script>
+ <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch"
+ title="Quick Search" value="[% quicksearch FILTER html %]">
+ <input class="btn" type="submit" value="Search"
+ id="find[% qs_suffix FILTER html %]">
+ [%-# Work around FF bug: keep this on one line %]</form>
+ <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a></li>
+</ul>
+
+[% IF user.login %]
+ <ul class="links-dropdown">
+ <li class="main">
+ [% IF sudoer %]
+ [%+ sudoer.login FILTER html %]
+ [% ELSE %]
+ [%+ user.login FILTER html %]
+ [% END %]
+ <ul>
+ <li><a href="report.cgi">Reports</a></li>
+ <li>
+ [% IF Param('shutdownhtml') || Bugzilla.has_flags %]
+ [% IF user.id %]
+ <a href="request.cgi?requester=[% user.login FILTER uri %]&requestee=
+ [% user.login FILTER uri %]&do_union=1&group=type&action=queue">My Requests</a>
+ [% ELSE %]
+ <a href="request.cgi">Requests</a>
+ [% END %]
+ [% END %]
+ [%-# Work around FF bug: keep this on one line %]</li>
+
+ [% Hook.process('action-links') %]
+
+ <li><a href="userprefs.cgi">Preferences</a></li>
+ [% IF user.can_administer %]
+ <li><a href="admin.cgi">Administration</a></li>
+ [% END %]
+
+ [% PROCESS link_to_documentation %]
+
+ [% IF sudoer %]
+ <li>
+ <a href="relogin.cgi?action=end-sudo">Stop impersonating [%+ user.login FILTER html %]</a>
+ </li>
+ [% END %]
+
+ <li>
+ [% IF user.authorizer.can_logout %]
+ <a href="index.cgi?logout=1">Log out</a>
+ [% END %]
+ [%-# Work around FF bug: keep this on one line %]</li>
+ </ul>
+ </li>
+ </ul>
+[% ELSE %]
+ <ul class="links-right">
+ [% PROCESS link_to_documentation %]
+
+ [% IF Param('createemailregexp')
+ && user.authorizer.user_can_create_account %]
+ <li id="new_account_container[% qs_suffix FILTER html %]">
+ <a href="createaccount.cgi">New Account</a>
+ </li>
+ [% END %]
+
+ [%# Only display one login form when we're on a LOGIN_REQUIRED page. That
+ # way, we're guaranteed that the user will use the form that has
+ # hidden_fields in it (the center form) instead of this one. Also, it's
+ # less confusing to have one form (as opposed to three) when you're
+ # required to log in.
+ #%]
+ [% IF user.authorizer.can_login && !Bugzilla.page_requires_login %]
+ [% PROCESS "account/auth/login-small.html.tmpl" %]
+ [% END %]
+ </ul>
+[% END %]
+
+[% PROCESS "global/useful-links.html.tmpl" %]
+
+[% Hook.process("link-row") %]
+[% BLOCK link_to_documentation %]
+ [% IF doc_section %]
+ <li>
+
+ <a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Help</a>
+ </li>
+ [% END %]
+[% END %]
+
+[% BLOCK relevant_user %]
+[% END %]
diff --git a/template/en/custom/global/footer.html.tmpl b/template/en/custom/global/footer.html.tmpl
new file mode 100644
index 0000000..d47d254
--- /dev/null
+++ b/template/en/custom/global/footer.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'global/footer_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'global/footer_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/footer_DEFAULT.html.tmpl b/template/en/custom/global/footer_DEFAULT.html.tmpl
new file mode 120000
index 0000000..f2e5690
--- /dev/null
+++ b/template/en/custom/global/footer_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/footer.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/footer_XFCE.html.tmpl b/template/en/custom/global/footer_XFCE.html.tmpl
new file mode 100644
index 0000000..3d05a21
--- /dev/null
+++ b/template/en/custom/global/footer_XFCE.html.tmpl
@@ -0,0 +1,11 @@
+[%# INTERFACE:
+ # This template has no interface. However, you must fulfill the interface to
+ # global/useful-links.html.tmpl.
+ #%]
+
+ [% Hook.process('main-end') %]
+ </div>
+
+ [% Hook.process("end") %]
+ </body>
+</html>
diff --git a/template/en/custom/global/header.html.tmpl b/template/en/custom/global/header.html.tmpl
new file mode 100644
index 0000000..6dd036f
--- /dev/null
+++ b/template/en/custom/global/header.html.tmpl
@@ -0,0 +1,285 @@
+[%# 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:
+ # (All the below interface elements are optional.)
+ # title: string. Page title.
+ # header: string. Main page header.
+ # subheader: string. Page subheader.
+ # header_addl_info: string. Additional header information.
+ # bodyclasses: array of extra CSS classes for the <body>
+ # onload: string. JavaScript code to run when the page finishes loading.
+ # javascript: string. Javascript to go in the header.
+ # javascript_urls: list. List of URLs to Javascript.
+ # style: string. CSS style.
+ # style_urls: list. List of URLs to CSS style sheets.
+ # message: string. A message to display to the user. May contain HTML.
+ # atomlink: Atom link URL, May contain HTML
+ # generate_api_token: generate a token which can be used to make authenticated webservice calls
+ #%]
+
+[% IF message %]
+ [% PROCESS global/messages.html.tmpl %]
+[% END %]
+
+[% DEFAULT
+ subheader = ""
+ header_addl_info = ""
+ onload = ""
+ style_urls = []
+ javascript_urls = []
+ yui = []
+ generate_api_token = 0
+ favicon_url = "skins/contrib/Xfce/favicon.ico"
+%]
+
+[% SET yui_css = {
+ autocomplete => 1,
+ calendar => 1,
+ datatable => 1,
+ button => 1,
+} %]
+
+[%# Note: This is simple dependency resolution--you can't have dependencies
+ # that depend on each other. You have to specify all of a module's deps,
+ # if that module is going to be specified in "yui".
+ #%]
+[% SET yui_deps = {
+ autocomplete => ['json', 'connection', 'datasource'],
+ datatable => ['json', 'connection', 'datasource', 'element'],
+} %]
+
+[%# When using certain YUI modules, we need to process certain
+ # extra JS templates.
+ #%]
+[% SET yui_templates = {
+ datatable => ['global/value-descs.js.tmpl'],
+} %]
+
+[%# These are JS URLs that are *always* on the page and come before
+ # every other JS URL.
+ #%]
+[% SET starting_js_urls = [
+ "js/yui/yahoo-dom-event/yahoo-dom-event.js",
+ "js/yui/cookie/cookie-min.js",
+] %]
+
+
+[%# We should be able to set the default value of the header variable
+ # to the value of the title variable using the DEFAULT directive,
+ # but that doesn't work if a caller sets header to the empty string
+ # to avoid header inheriting the value of title, since DEFAULT
+ # mistakenly treats empty strings as undefined and gives header the
+ # value of title anyway. To get around that problem we explicitly
+ # set header's default value here only if it is undefined. %]
+[% IF !header.defined %][% header = title %][% END %]
+
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ [% Hook.process("start") %]
+ <title>[% title %]</title>
+
+ <meta name="viewport" content="width=device-width, maximum-scale=1.0, minimum-scale=1.0, initial-scale=1" />
+
+ [% IF Param('utf8') %]
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ [% END %]
+
+ [% SET yui = yui_resolve_deps(yui, yui_deps) %]
+
+ [% SET css_sets = css_files(style_urls, yui, yui_css) %]
+ [% IF constants.CONCATENATE_ASSETS %]
+ [% PROCESS format_css_link asset_url = css_sets.unified_standard_skin %]
+ [% ELSE %]
+ [% FOREACH asset_url = css_sets.standard %]
+ [% PROCESS format_css_link %]
+ [% END %]
+ [% FOREACH asset_url = css_sets.skin %]
+ [% PROCESS format_css_link %]
+ [% END %]
+ [% END %]
+
+ [% IF style %]
+ <style type="text/css">
+ [% style %]
+ </style>
+ [% END %]
+
+ [% IF css_sets.unified_custom %]
+ [% IF constants.CONCATENATE_ASSETS %]
+ [% PROCESS format_css_link asset_url = css_sets.unified_custom %]
+ [% ELSE %]
+ [% FOREACH asset_url = css_sets.custom %]
+ [% PROCESS format_css_link %]
+ [% END %]
+ [% END %]
+ [% END %]
+
+ [%# YUI Scripts %]
+ [% FOREACH yui_name = yui %]
+ [% starting_js_urls.push("js/yui/$yui_name/${yui_name}-min.js") %]
+ [% END %]
+ [% starting_js_urls.push('js/global.js') %]
+
+ [% FOREACH asset_url = concatenate_js(starting_js_urls) %]
+ [% PROCESS format_js_link %]
+ [% END %]
+
+ <link rel="stylesheet" media="screen" type="text/css" href="/skins/header.css" />
+ <link rel="stylesheet" media="screen" type="text/css" href="/skins/xfce.css" />
+ [% IF user.settings.skin.value == 'Xfce' %]
+ <script type="text/javascript" src="/skins/contrib/Xfce/scripts.js"></script>
+ [% END %]
+
+ <script type="text/javascript">
+ <!--
+ YAHOO.namespace('bugzilla');
+ YAHOO.util.Event.addListener = function (el, sType, fn, obj, overrideContext) {
+ if ( ("onpagehide" in window || YAHOO.env.ua.gecko) && sType === "unload") { sType = "pagehide"; };
+ var capture = ((sType == "focusin" || sType == "focusout") && !YAHOO.env.ua.ie) ? true : false;
+ return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture);
+ };
+ if ( "onpagehide" in window || YAHOO.env.ua.gecko) {
+ YAHOO.util.Event._simpleRemove(window, "unload",
+ YAHOO.util.Event._unload);
+ }
+ [%# The language selector needs javascript to set its cookie,
+ # so it is hidden in HTML/CSS by the "bz_default_hidden" class.
+ # If the browser can run javascript, it will then "unhide"
+ # the language selector using the following code.
+ #%]
+ function unhide_language_selector() {
+ YAHOO.util.Dom.removeClass(
+ 'lang_links_container', 'bz_default_hidden'
+ );
+ }
+ YAHOO.util.Event.onDOMReady(unhide_language_selector);
+
+ [%# Make some Bugzilla information available to all scripts.
+ # We don't import every parameter and constant because we
+ # don't want to add a lot of uncached JS to every page.
+ #%]
+ var BUGZILLA = {
+ param: {
+ cookiepath: '[% Param('cookiepath') FILTER js %]',
+ maxusermatches: [% Param('maxusermatches') FILTER js %]
+ },
+ constant: {
+ COMMENT_COLS: [% constants.COMMENT_COLS FILTER js %]
+ },
+ string: {
+ [%# Please keep these in alphabetical order. %]
+
+ attach_desc_required:
+ "You must enter a Description for this attachment.",
+ component_required:
+ "You must select a Component for this [% terms.bug %].",
+ description_required:
+ "You must enter a Description for this [% terms.bug %].",
+ short_desc_required:
+ "You must enter a Summary for this [% terms.bug %].",
+ version_required:
+ "You must select a Version for this [% terms.bug %]."
+ }
+ [% IF generate_api_token %]
+ , api_token: '[% get_api_token FILTER js FILTER html %]'
+ [% END %]
+ };
+
+ [% FOREACH yui_name = yui %]
+ [% FOREACH yui_template = yui_templates.$yui_name %]
+ [% INCLUDE $yui_template %]
+ [% END %]
+ [% END %]
+ [% IF javascript %]
+ [% javascript %]
+ [% END %]
+ // -->
+ </script>
+
+ [% FOREACH asset_url = concatenate_js(javascript_urls) %]
+ [% PROCESS format_js_link %]
+ [% END %]
+
+ [%# this puts the live bookmark up on firefox for the Atom feed %]
+ [% IF atomlink %]
+ <link rel="alternate"
+ type="application/atom+xml" title="Atom feed"
+ href="[% atomlink FILTER html %]">
+ [% END %]
+
+ [%# Required for the 'Autodiscovery' feature in Firefox 2 and IE 7. %]
+ <link rel="search" type="application/opensearchdescription+xml"
+ title="[% terms.Bugzilla %]" href="./search_plugin.cgi">
+ <link rel="shortcut icon" href="[% favicon_url FILTER html %]">
+ [% Hook.process("additional_header") %]
+ </head>
+
+ <body [% IF onload %] onload="[% onload %]"[% END %]
+ class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %]
+ [% FOREACH class = bodyclasses %]
+ [%+ class FILTER css_class_quote %]
+ [% END %] yui-skin-sam">
+
+ [% INCLUDE global/banner.html.tmpl %]
+
+ <div id="header">
+
+ <div id="titles">
+ <span id="title">Xfce [% terms.Bugzilla %][% " – $header" IF header %]</span>
+
+ [% IF subheader %]
+ <span id="subtitle" class="subheader">[% subheader %]</span>
+ [% END %]
+
+ [% IF header_addl_info %]
+ <span id="information" class="header_addl_info">[% header_addl_info %]</span>
+ [% END %]
+ </div>
+
+ [% USE Bugzilla %]
+ [% IF Bugzilla.languages.size > 1 %]
+ <div id="lang_links_container" class="bz_default_hidden">
+ <ul class="links">
+ [% FOREACH lang = Bugzilla.languages.sort %]
+ <li>
+ [% IF NOT loop.first %]<span class="separator"> | </span>[% END %]
+ [% IF lang == current_language %]
+ <span class="lang_current">[% lang FILTER html FILTER upper %]</span>
+ [% ELSE %]
+ <a href="#" onclick="set_language('[% lang FILTER none %]');">
+ [%- lang FILTER html FILTER upper %]</a>
+ [% END %]
+ </li>
+ [% END %]
+ </ul>
+ </div>
+ [% END %]
+
+ <div id="common_links">
+ [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %]
+ </div>
+ </div>
+
+ <div id="bugzilla-body">
+ [% IF Param('announcehtml') %]
+ [% Param('announcehtml') FILTER none %]
+ [% END %]
+
+ [% IF message %]
+ <div id="message">[% message %]</div>
+ [% END %]
+
+[% BLOCK format_css_link %]
+ <link href="[% asset_url FILTER html %]" rel="stylesheet" type="text/css">
+[% END %]
+
+[% BLOCK format_js_link %]
+ <script type="text/javascript" src="[% asset_url FILTER mtime FILTER html %]"></script>
+[% END %]
diff --git a/template/en/custom/global/useful-links.html.tmpl b/template/en/custom/global/useful-links.html.tmpl
new file mode 100644
index 0000000..aa11668
--- /dev/null
+++ b/template/en/custom/global/useful-links.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'global/useful-links_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'global/useful-links_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/global/useful-links_DEFAULT.html.tmpl b/template/en/custom/global/useful-links_DEFAULT.html.tmpl
new file mode 120000
index 0000000..3b2ca14
--- /dev/null
+++ b/template/en/custom/global/useful-links_DEFAULT.html.tmpl
@@ -0,0 +1 @@
+../../default/global/useful-links.html.tmpl
\ No newline at end of file
diff --git a/template/en/custom/global/useful-links_XFCE.html.tmpl b/template/en/custom/global/useful-links_XFCE.html.tmpl
new file mode 100644
index 0000000..efda535
--- /dev/null
+++ b/template/en/custom/global/useful-links_XFCE.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.
+ #%]
+
+[%# Saved searches %]
+
+[% IF user.showmybugslink OR user.queries.size OR user.queries_subscribed.size OR user.reports.size %]
+ <ul class="links-dropdown">
+ <li class="main">
+ My Links
+ <ul>
+ [% IF user.showmybugslink %]
+ [% filtered_username = user.login FILTER uri %]
+ <li>
+ <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a>
+ </li>
+ [% END %]
+
+ [% IF user.queries.size %]
+ [% FOREACH q = user.queries %]
+ [% NEXT UNLESS q.link_in_footer %]
+ <li>
+ <a href="buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER uri %]">[% q.name FILTER html %]</a>
+ </li>
+ [% END %]
+ [% END %]
+
+ [% IF user.queries_subscribed.size %]
+ [% FOREACH q = user.queries_subscribed %]
+ <li>
+ <a href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=
+ [%- q.name FILTER uri %]&sharer_id=[% q.user.id FILTER uri %]"
+ class="shared" title="Shared by [% q.user.identity FILTER html %]">
+ [%- q.name FILTER html %]</a>
+ </li>
+ [% END %]
+ [% END %]
+ [% IF user.reports.size %]
+ [% FOREACH r = user.reports %]
+ <li>
+ <a href="report.cgi?[% r.query FILTER html %]&saved_report_id=
+ [%~ r.id FILTER uri %]">[% r.name FILTER html %]</a>
+ </li>
+ [% END %]
+ [% END %]
+
+ [%# Sections of links to more things users can do on this installation. %]
+ [% Hook.process("end") %]
+
+ </ul>
+ </li>
+ </ul>
+[% END %]
diff --git a/template/en/custom/index.html.tmpl b/template/en/custom/index.html.tmpl
new file mode 100644
index 0000000..24cd332
--- /dev/null
+++ b/template/en/custom/index.html.tmpl
@@ -0,0 +1,163 @@
+[%# 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:
+ # release: a hash containing data about new releases, if any.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Xfce Bugzilla"
+ header = "Main Page"
+ header_addl_info = "version $constants.BUGZILLA_VERSION"
+%]
+
+[% IF release %]
+ <div id="new_release">
+ [% IF release.data %]
+ [% IF release.deprecated %]
+ <p>Bugzilla [%+ release.deprecated FILTER html %] is no longer
+ supported. You are highly encouraged to upgrade in order to keep your
+ system secure.</p>
+ [% END %]
+
+ <p>A new Bugzilla version ([% release.data.latest_ver FILTER html %])
+ is available at
+ <a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br>
+ Release date: [% release.data.date FILTER html %]</p>
+
+ <p class="notice">This message is only shown to logged in users with admin privs.
+ You can configure this notification from the
+ <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p>
+ [% ELSIF release.error == "cannot_download" %]
+ <p>The remote file <a href="[% constants.REMOTE_FILE FILTER html %]">
+ [%~ constants.REMOTE_FILE FILTER html %]</a> cannot be downloaded
+ (reason: [% release.reason FILTER html %]).<br>
+ Either the remote server is temporarily unavailable, or your web server cannot access
+ the web. If you are behind a proxy, set the
+ <a href="editparams.cgi?section=advanced#proxy_url_desc">proxy_url</a> parameter correctly.</p>
+ [% ELSIF release.error == "no_write" %]
+ <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be created
+ (reason: [% release.reason FILTER html %]).<br>
+ Please make sure the web server can write into this directory.
+ [% ELSIF release.error == "no_update" %]
+ <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be updated.
+ Please make sure the web server can edit this file.</p>
+ [% ELSIF release.error == "no_access" %]
+ <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be read.
+ Please make sure this file has the correct rights set on it.</p>
+ [% ELSIF release.error == "corrupted" %]
+ <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' has an invalid XML format.
+ Please delete it and try accessing this page again.</p>
+ [% ELSIF release.error == "unknown_parameter" %]
+ <p>'[% Param("upgrade_notification") FILTER html %]' is not a valid notification
+ parameter. Please check this parameter in the
+ <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p>
+ [% END %]
+ </div>
+[% END %]
+
+<div id="page-index">
+ <h1 id="welcome">Welcome to the Xfce bug tracker!</h1>
+ <div class="intro">[% Hook.process('intro') %]</div>
+
+ <div class="bz_common_actions">
+ <ul>
+ <li>
+ <a class="action-link" id="enter_bug" href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a>
+ </li>
+ <li>
+ <a class="action-link" id="query" href="query.cgi"><span>Search</span></a>
+ </li>
+ <li>
+ <a class="action-link" id="account"
+ [% IF user.id %]
+ href="userprefs.cgi"><span>User Preferences</span></a>
+ [% ELSIF Param('createemailregexp') && user.authorizer.user_can_create_account %]
+ href="createaccount.cgi"><span>Open a New Account</span></a>
+ [% ELSE %]
+ href="?GoAheadAndLogIn=1"><span>Log In</span></a>
+ [% END %]
+ </li>
+ <li>
+ <a class="action-link" id="help" href="[% docs_urlbase FILTER html %]using/index.html"><span>Documentation</span></a>
+ </li>
+ </ul>
+ </div>
+
+ <div>
+ <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi">
+ <input id="quicksearch_main" name="quicksearch" title="Quick Search"
+ placeholder="Enter [% terms.abug %] # or some search terms"
+ autofocus required>
+ <input id="find" type="submit" value="Quick Search">
+ <a href="page.cgi?id=quicksearch.html" title="Quick Search help">[?]</a>
+ </form>
+
+ <ul class="additional_links">
+ [% Hook.process('additional_links') %]
+ </ul>
+ </div>
+
+ <div id="common_queries">
+ <h4>Common Queries:</h4>
+ <ul>
+ [% IF user.id %]
+ <li>
+ [% title = BLOCK %]Open [% terms.bugs %] assigned to me[% END %]
+ <a href="buglist.cgi?f1=assigned_to&o1=equals&v1=%25user%25&resolution=---">
+ [% title FILTER html %]</a> ([% assignee_count FILTER html %])
+ <a href="buglist.cgi?f1=assigned_to&o1=equals&v1=%25user%25&resolution=---&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ </li>
+ <li>
+ [% title = BLOCK %]Open [% terms.bugs %] reported by me[% END %]
+ <a href="buglist.cgi?f1=reporter&o1=equals&v1=%25user%25&resolution=---">
+ [% title FILTER html %]</a> ([% reporter_count FILTER html %])
+ <a href="buglist.cgi?f1=reporter&o1=equals&v1=%25user%25&resolution=---&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ </li>
+ [% IF Bugzilla.has_flags %]
+ <li>
+ [% title = BLOCK %]Requests addressed to me[% END %]
+ <a href="request.cgi?action=queue&requestee=[% user.login FILTER uri %]&group=type&do_union=0">
+ [% title FILTER html %]</a> ([% requestee_count FILTER html %])
+ <a href="buglist.cgi?f1=requestees.login_name&o1=equals&v1=%25user%25&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ </li>
+ [% END %]
+ [% END %]
+
+ <li>
+ [% terms.Bugs %] reported in the
+ <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=24h">last 24 hours</a>
+ [% title = BLOCK %][% terms.Bugs %] reported in the last 24 hours[% END %]
+ <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=24h&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ | <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d">last 7 days</a>
+ [% title = BLOCK %][% terms.Bugs %] reported in the last 7 days[% END %]
+ <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ </li>
+ <li>
+ [% terms.Bugs %] changed in the
+ <a href="buglist.cgi?chfieldfrom=24h">last 24 hours</a>
+ [% title = BLOCK %][% terms.Bugs %] changed in the last 24 hours[% END %]
+ <a href="buglist.cgi?chfieldfrom=24h&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ | <a href="buglist.cgi?chfieldfrom=7d">last 7 days</a>
+ [% title = BLOCK %][% terms.Bugs %] changed in the last 7 days[% END %]
+ <a href="buglist.cgi?chfieldfrom=7d&ctype=atom&title=[% title FILTER uri %]"
+ class="rss"> </a>
+ </li>
+ </ul>
+ </div>
+
+ <div class="outro">[% Hook.process('outro') %]</div>
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/custom/list/list.html.tmpl b/template/en/custom/list/list.html.tmpl
new file mode 100644
index 0000000..c617c62
--- /dev/null
+++ b/template/en/custom/list/list.html.tmpl
@@ -0,0 +1,5 @@
+[% IF user.settings.skin.value == 'Xfce' %]
+ [% PROCESS 'list/list_XFCE.html.tmpl' %]
+[% ELSE %]
+ [% PROCESS 'list/list_DEFAULT.html.tmpl' %]
+[% END %]
diff --git a/template/en/custom/list/list_DEFAULT.html.tmpl b/template/en/custom/list/list_DEFAULT.html.tmpl
new file mode 100644
index 0000000..c2631a4
--- /dev/null
+++ b/template/en/custom/list/list_DEFAULT.html.tmpl
@@ -0,0 +1,349 @@
+[%# 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:
+ # searchtype: string. Type of search - either "series", "saved" or undef.
+ # ...
+ # defaultsavename: string. The default name for saving the query.
+ #%]
+
+[%############################################################################%]
+[%# Template Initialization #%]
+[%############################################################################%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% unfiltered_title = "$terms.Bug List" %]
+[% IF searchname || defaultsavename %]
+ [% unfiltered_title = unfiltered_title _ ": " _ (searchname OR defaultsavename) %]
+[% END %]
+[% title = unfiltered_title FILTER html %]
+
+[% qorder = order FILTER uri IF order %]
+
+[% javascript = BLOCK %]
+ [% IF quicksearch %]
+ [% new_param = BLOCK ~%]
+ quicksearch=[% quicksearch FILTER uri %]
+ [%~ IF cgi.param('list_id') ~%]
+ &list_id=[% cgi.param('list_id') FILTER uri %]
+ [%~ END %]
+ [% END %]
+ [% ELSIF cgi.param('token') != '' %]
+ [% new_param = cgi.canonicalise_query('token', 'cmdtype', 'remtype') %]
+ [% ELSE %]
+ [% new_param = cgi.canonicalise_query %]
+ [% END %]
+
+ [% IF new_param.length + 12 < constants.CGI_URI_LIMIT %]
+ if (history && history.replaceState) {
+ history.replaceState(null, "[% unfiltered_title FILTER js %]",
+ "buglist.cgi?[% new_param FILTER js %]");
+ document.title = "[% unfiltered_title FILTER js %]";
+ }
+ [% END %]
+ [% javascript FILTER none %]
+[% END %]
+
+[%############################################################################%]
+[%# Page Header #%]
+[%############################################################################%]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ generate_api_token = dotweak
+ atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom"
+ yui = [ 'autocomplete', 'calendar' ]
+ javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ]
+ style_urls = [ "skins/standard/buglist.css" ]
+ doc_section = "using/finding.html"
+%]
+
+<div class="bz_query_head">
+ <span class="bz_query_timestamp">
+ [% currenttime FILTER time('%a %b %e %Y %T %Z') FILTER html %]<br>
+ </span>
+
+ [% IF debug %]
+ <div class="bz_query_debug">
+ <p>Total execution time: [% query_time FILTER html %] seconds</p>
+ [% FOREACH query = queries %]
+ <pre>[% query.sql FILTER html %]</pre>
+ <p>Execution time: [% query.time FILTER html %] seconds</p>
+ [% IF query.explain %]
+ <pre>[% query.explain FILTER html %]</pre>
+ [% END %]
+ [% END %]
+ </div>
+ [% END %]
+
+ [% IF user.settings.display_quips.value == 'on' %]
+ [% DEFAULT quip = "Bugzilla would like to put a random quip here, but no one has entered any." %]
+ <span class="bz_quip">
+ <a href="quips.cgi"><em>[% quip FILTER html %]</em></a>
+ </span>
+ [% END %]
+</div>
+
+[% IF toolong %]
+ <h2 class="bz_smallminded">
+ This list is too long for Bugzilla's little mind; the
+ Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %].
+ </h2>
+[% END %]
+
+[% SET shown_types = [
+ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq',
+ 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter',
+ 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
+ 'nowordssubstr', 'notmatches', 'isempty', 'isnotempty'
+] %]
+
+<a id="search_description_controller" class="bz_default_hidden"
+ href="javascript:TUI_toggle_class('search_description')">Hide Search Description</a>
+[%# Show the link if the browser supports JS %]
+<script type="text/javascript">
+ TUI_alternates['search_description'] = 'Show Search Description';
+ YAHOO.util.Dom.removeClass('search_description_controller',
+ 'bz_default_hidden');
+</script>
+
+<ul class="search_description">
+[% FOREACH desc_item = search_description %]
+ <li>
+ <strong>[% field_descs.${desc_item.field} FILTER html %]:</strong>
+ [% IF shown_types.contains(desc_item.type) || debug %]
+ ([% search_descs.${desc_item.type} FILTER html %])
+ [% END %]
+ [% FOREACH val IN desc_item.value.split(',') %]
+ [%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %]
+ [% END %]
+ [% IF debug %]
+ (<code>[% desc_item.term FILTER html %]</code>)
+ [% END %]
+ </li>
+[% END %]
+</ul>
+
+<hr />
+
+[%############################################################################%]
+[%# Preceding Status Line #%]
+[%############################################################################%]
+
+[% IF bugs.size > 9 %]
+ [% PROCESS num_results %]
+[% END %]
+
+[%############################################################################%]
+[%# Start of Change Form #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+ <form name="changeform" method="post" action="process_bug.cgi">
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table #%]
+[%############################################################################%]
+
+[% PROCESS list/table.html.tmpl %]
+
+[%############################################################################%]
+[%# Succeeding Status Line #%]
+[%############################################################################%]
+
+[% PROCESS num_results %]
+
+[% IF bugs.size == 0 %]
+ <ul class="zero_result_links">
+ <li>[% PROCESS enter_bug_link %]</li>
+ [% IF one_product.defined %]
+ <li><a href="enter_bug.cgi">File a new [% terms.bug %] in a
+ different product</a></li>
+ [% END %]
+ <li><a href="[% PROCESS edit_search_url %]">Edit this search</a></li>
+ <li><a href="query.cgi">Start a new search</a></li>
+ </ul>
+[% END %]
+
+[%############################################################################%]
+[%# Rest of Change Form #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+ [% PROCESS "list/edit-multiple.html.tmpl" %]
+ </form>
+ <hr>
+[% END %]
+
+[%############################################################################%]
+[%# Navigation Bar #%]
+[%############################################################################%]
+
+ <div class="buglist_menu">
+ [% IF bugs.size > 0 %]
+ <div class="bz_query_buttons">
+ <form method="post" action="show_bug.cgi">
+ [% buglist_joined = buglist.join(",") %]
+ <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+ <input type="hidden" name="format" value="multiple">
+ <input type="submit" id="long_format" value="Long Format">
+ </form>
+
+ [% IF user.is_timetracker %]
+ <form method="post" action="summarize_time.cgi">
+ <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+ <input type="submit" id="timesummary" value="Time Summary">
+ </form>
+ [% IF time_summary_limited %]
+ <span class="bz_info">
+ Time Summary will only include the [% terms.bugs %] shown above.
+ In order to see a time summary for all [% terms.bugs %] found
+ by the search, you can
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&limit=0">
+ show all search results</a>.
+ </span>
+ [% END %]
+ [% END %]
+
+ <form method="post" action="show_bug.cgi">
+ <input type="hidden" name="ctype" value="xml">
+ [% FOREACH id = buglist %]
+ <input type="hidden" name="id" value="[% id FILTER html %]">
+ [% END %]
+ <input type="hidden" name="excludefield" value="attachmentdata">
+ <button type="submit" id="xml">
+ <img src="images/xml.png" width="24" height="24" alt="XML" title="XML Format">
+ </button>
+ </form>
+ </div>
+ <div class="bz_query_links">
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=csv&human=1"
+ ><img title="CSV Format" alt="CSV" src="images/csv.png" height="24" width="24"></a>
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]&title=
+ [%- title FILTER uri %]&ctype=atom"
+ ><img title="Feed Format" alt="Feed" src="images/rss.png" height="24" width="24"></a>
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=ics"
+ ><img title="iCal Format" alt="iCal" src="images/ical.png" height="24" width="24"></a>
+ <button type="button" id="change_columns"
+ onclick="document.location='colchange.cgi?[% urlquerypart FILTER html %]&query_based_on=
+ [%~ defaultsavename OR searchname FILTER uri FILTER js %]'">
+ Change Columns</button>
+
+
+ [% IF bugs.size > 1 && caneditbugs && !dotweak %]
+ <button type="button" id="mass_change"
+ onclick="document.location='buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&tweak=1'">
+ Change Several [% terms.Bugs %] at Once</button>
+ [% END %]
+
+ [% IF bugowners && user.id %]
+ <button type="button" id="email_assignees"
+ onclick="document.location='mailto:[% bugowners FILTER html %]'">
+ Send Mail to [% terms.Bug %] Assignees</button>
+ [% END %]
+
+ [%# Links to more things users can do with this bug list. %]
+ [% Hook.process("links") %]
+ </div>
+ <br>
+ [% END %]
+ <div class="bz_query_edit">
+ <button type="button" id="edit_search"
+ onclick="document.location='[% PROCESS edit_search_url FILTER js %]'">
+ Edit Search</button>
+ </div>
+
+ [% IF searchtype == "saved" %]
+ <div class="bz_query_forget">
+ <button type="button" id="forget_search"
+ onclick="document.location='buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=
+ [%- searchname FILTER uri FILTER js %]&token=
+ [%- issue_hash_token([search_id, searchname]) FILTER uri %]'">
+ Forget Search '[% searchname FILTER html %]'</button>
+ </div>
+ [% ELSE %]
+ <div class="bz_query_remember">
+ <form method="get" action="buglist.cgi">
+ <input type="submit" id="remember" value="Remember search"> as
+ <input type="hidden" name="newquery"
+ value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
+ <input type="hidden" name="cmdtype" value="doit">
+ <input type="hidden" name="remtype" value="asnamed">
+ <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]">
+ <input type="text" id="save_newqueryname" name="newqueryname" size="20"
+ title="New query name" value="[% defaultsavename FILTER html %]">
+ </form>
+ </div>
+ [% END %]
+ </div>
+
+[% IF one_product.defined && bugs.size %]
+ <p class="bz_query_single_product">
+ [% PROCESS enter_bug_link %]
+ </p>
+[% END %]
+
+[%############################################################################%]
+[%# Page Footer #%]
+[%############################################################################%]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%##########%]
+[%# Blocks #%]
+[%##########%]
+
+[% BLOCK edit_search_url %]
+ [% editqueryname = searchname OR defaultsavename OR '' %]
+ query.cgi?[% urlquerypart FILTER html %]
+ [%- IF editqueryname != '' %]&known_name=
+ [%- editqueryname FILTER uri %]
+ [% END %]
+[% END %]
+
+[% BLOCK enter_bug_link %]
+ <a href="enter_bug.cgi
+ [%- IF one_product.defined %]?product=
+ [%- one_product.name FILTER uri %]
+ [%- IF one_component.defined %]&component=
+ [%- one_component FILTER uri %][% END %][% END %]">File
+ a new [% terms.bug %]
+ [% IF one_product.defined %]
+ in the
+ [% IF one_component.defined %]
+ "[% one_component FILTER html %]" component of the
+ [% END %]
+ "[% one_product.name FILTER html %]" product
+ [% END %]</a>
+[% END %]
+
+[% BLOCK num_results %]
+ <span class="bz_result_count">
+ [% IF bugs.size == 0 %]
+ <span class="zero_results">[% terms.zeroSearchResults %].</span>
+ [% ELSIF default_limited AND bugs.size >= Param('default_search_limit') %]
+ This result was limited to [% Param('default_search_limit') FILTER html %]
+ [%+ terms.bugs %].
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&limit=0">See
+ all search results for this query</a>.
+ [% time_summary_limited = 1 %]
+ [% ELSIF bugs.size == 1 %]
+ One [% terms.bug %] found.
+ [% ELSE %]
+ [% bugs.size %] [%+ terms.bugs %] found.
+ [% END %]
+ </span>
+[% END %]
diff --git a/template/en/custom/list/list_XFCE.html.tmpl b/template/en/custom/list/list_XFCE.html.tmpl
new file mode 100644
index 0000000..f3a45f1
--- /dev/null
+++ b/template/en/custom/list/list_XFCE.html.tmpl
@@ -0,0 +1,328 @@
+[%# 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:
+ # searchtype: string. Type of search - either "series", "saved" or undef.
+ # ...
+ # defaultsavename: string. The default name for saving the query.
+ #%]
+
+[%############################################################################%]
+[%# Template Initialization #%]
+[%############################################################################%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% unfiltered_title = "$terms.Bug List" %]
+[% IF searchname || defaultsavename %]
+ [% unfiltered_title = unfiltered_title _ ": " _ (searchname OR defaultsavename) %]
+[% END %]
+[% title = unfiltered_title FILTER html %]
+
+[% qorder = order FILTER uri IF order %]
+
+[% javascript = BLOCK %]
+ [% IF quicksearch %]
+ [% new_param = BLOCK ~%]
+ quicksearch=[% quicksearch FILTER uri %]
+ [%~ IF cgi.param('list_id') ~%]
+ &list_id=[% cgi.param('list_id') FILTER uri %]
+ [%~ END %]
+ [% END %]
+ [% ELSIF cgi.param('token') != '' %]
+ [% new_param = cgi.canonicalise_query('token', 'cmdtype', 'remtype') %]
+ [% ELSE %]
+ [% new_param = cgi.canonicalise_query %]
+ [% END %]
+
+ [% IF new_param.length + 12 < constants.CGI_URI_LIMIT %]
+ if (history && history.replaceState) {
+ history.replaceState(null, "[% unfiltered_title FILTER js %]",
+ "buglist.cgi?[% new_param FILTER js %]");
+ document.title = "[% unfiltered_title FILTER js %]";
+ }
+ [% END %]
+ [% javascript FILTER none %]
+[% END %]
+
+[%############################################################################%]
+[%# Page Header #%]
+[%############################################################################%]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ generate_api_token = dotweak
+ atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom"
+ yui = [ 'autocomplete', 'calendar' ]
+ javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ]
+ style_urls = [ "skins/standard/buglist.css" ]
+ doc_section = "using/finding.html"
+%]
+
+[% SET shown_types = [
+ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq',
+ 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter',
+ 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
+ 'nowordssubstr', 'notmatches', 'isempty', 'isnotempty'
+] %]
+
+<h2>Search results ([% bugs.size %] bugs)</h2>
+[% IF default_limited AND bugs.size >= Param('default_search_limit') %]
+ <p>This result was limited to [% Param('default_search_limit') FILTER html %] [%+ terms.bugs %].
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&limit=0">See
+ all search results for this query</a>.
+ </p>
+ [% time_summary_limited = 1 %]
+[% END %]
+
+<ul class="search_description">
+[% FOREACH desc_item = search_description %]
+ <li>
+ <strong>[% field_descs.${desc_item.field} FILTER html %]:</strong>
+ [% IF shown_types.contains(desc_item.type) || debug %]
+ ([% search_descs.${desc_item.type} FILTER html %])
+ [% END %]
+ [% FOREACH val IN desc_item.value.split(',') %]
+ [%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %]
+ [% END %]
+ [% IF debug %]
+ (<code>[% desc_item.term FILTER html %]</code>)
+ [% END %]
+ </li>
+[% END %]
+</ul>
+
+<hr />
+
+[% IF dotweak %]
+ <form name="changeform" method="post" action="process_bug.cgi">
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table #%]
+[%############################################################################%]
+
+[% PROCESS list/table.html.tmpl %]
+
+[%############################################################################%]
+[%# Succeeding Status Line #%]
+[%############################################################################%]
+
+[% IF bugs.size == 0 %]
+ <ul class="zero_result_links">
+ <li>[% PROCESS enter_bug_link %]</li>
+ [% IF one_product.defined %]
+ <li><a href="enter_bug.cgi">File a new [% terms.bug %] in a
+ different product</a></li>
+ [% END %]
+ <li><a href="[% PROCESS edit_search_url %]">Edit this search</a></li>
+ <li><a href="query.cgi">Start a new search</a></li>
+ </ul>
+[% END %]
+
+[%############################################################################%]
+[%# Rest of Change Form #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+ [% PROCESS "list/edit-multiple.html.tmpl" %]
+ </form>
+ <hr>
+[% END %]
+
+[%############################################################################%]
+[%# Navigation Bar #%]
+[%############################################################################%]
+
+<hr />
+
+<form action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '')
+ { alert('Please enter one or more search terms first.');
+ return false; } return true;">
+ <script type="text/javascript">
+ if (history && history.replaceState) {
+ var no_redirect = document.getElementById("no_redirect_buglist");
+ no_redirect.value = 1;
+ }
+ </script>
+ <b>Search again:</b>
+ <input class="txt" type="text" id="quicksearch_buglist" name="quicksearch"
+ title="Quick Search" value="[% quicksearch FILTER html %]">
+ <input class="btn" type="submit" value="Search"
+ id="find_buglist">
+ <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a>
+[%-# Work around FF bug: keep this on one line %]</form>
+
+ <div class="buglist_menu">
+ [% IF bugs.size > 0 %]
+ <div class="bz_query_buttons">
+ <form method="post" action="show_bug.cgi">
+ [% buglist_joined = buglist.join(",") %]
+ <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+ <input type="hidden" name="format" value="multiple">
+ <input type="submit" id="long_format" value="Long Format">
+ </form>
+
+ [% IF user.is_timetracker %]
+ <form method="post" action="summarize_time.cgi">
+ <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+ <input type="submit" id="timesummary" value="Time Summary">
+ </form>
+ [% IF time_summary_limited %]
+ <span class="bz_info">
+ Time Summary will only include the [% terms.bugs %] shown above.
+ In order to see a time summary for all [% terms.bugs %] found
+ by the search, you can
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&limit=0">
+ show all search results</a>.
+ </span>
+ [% END %]
+ [% END %]
+
+ <form method="post" action="show_bug.cgi">
+ <input type="hidden" name="ctype" value="xml">
+ [% FOREACH id = buglist %]
+ <input type="hidden" name="id" value="[% id FILTER html %]">
+ [% END %]
+ <input type="hidden" name="excludefield" value="attachmentdata">
+ <button type="submit" id="xml">XML</button>
+ </form>
+ </div>
+ <div class="bz_query_links">
+ <a class="action-link" href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=csv&human=1">CSV</a>
+ <a class="action-link" href="buglist.cgi?[% urlquerypart FILTER html %]&title=[%- title FILTER uri %]&ctype=atom">RSS</a>
+ <a class="action-link" href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=ics">iCal</a>
+ </div>
+ <br />
+ <div class="bz_query_links">
+ <button type="button" id="change_columns"
+ onclick="document.location='colchange.cgi?[% urlquerypart FILTER html %]&query_based_on=
+ [%~ defaultsavename OR searchname FILTER uri FILTER js %]'">
+ Change Columns</button>
+
+
+ [% IF bugs.size > 1 && caneditbugs && !dotweak %]
+ <button type="button" id="mass_change"
+ onclick="document.location='buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&tweak=1'">
+ Change Several [% terms.Bugs %] at Once</button>
+ [% END %]
+
+ [% IF bugowners && user.id %]
+ <button type="button" id="email_assignees"
+ onclick="document.location='mailto:[% bugowners FILTER html %]'">
+ Send Mail to [% terms.Bug %] Assignees</button>
+ [% END %]
+
+ [%# Links to more things users can do with this bug list. %]
+ [% Hook.process("links") %]
+ </div>
+ <br>
+ [% END %]
+ <div class="bz_query_edit">
+ <button type="button" id="edit_search"
+ onclick="document.location='[% PROCESS edit_search_url FILTER js %]'">
+ Edit Search</button>
+ </div>
+
+ [% IF searchtype == "saved" %]
+ <div class="bz_query_forget">
+ <button type="button" id="forget_search"
+ onclick="document.location='buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=
+ [%- searchname FILTER uri FILTER js %]&token=
+ [%- issue_hash_token([search_id, searchname]) FILTER uri %]'">
+ Forget Search '[% searchname FILTER html %]'</button>
+ </div>
+ [% ELSE %]
+ <div class="bz_query_remember">
+ <form method="get" action="buglist.cgi">
+ <input type="submit" id="remember" value="Remember search"> as
+ <input type="hidden" name="newquery"
+ value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
+ <input type="hidden" name="cmdtype" value="doit">
+ <input type="hidden" name="remtype" value="asnamed">
+ <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]">
+ <input type="text" id="save_newqueryname" name="newqueryname" size="20"
+ title="New query name" value="[% defaultsavename FILTER html %]">
+ </form>
+ </div>
+ [% END %]
+ </div>
+
+[% IF one_product.defined && bugs.size %]
+ <p class="bz_query_single_product">
+ [% PROCESS enter_bug_link %]
+ </p>
+[% END %]
+
+[% IF debug %]
+ <div class="bz_query_debug">
+ <p>Total execution time: [% query_time FILTER html %] seconds</p>
+ [% FOREACH query = queries %]
+ <pre>[% query.sql FILTER html %]</pre>
+ <p>Execution time: [% query.time FILTER html %] seconds</p>
+ [% IF query.explain %]
+ <pre>[% query.explain FILTER html %]</pre>
+ [% END %]
+ [% END %]
+ </div>
+[% END %]
+
+[% IF user.settings.display_quips.value == 'on' %]
+ [% DEFAULT quip = "Bugzilla would like to put a random quip here, but no one has entered any." %]
+ <span class="bz_quip">
+ <a href="quips.cgi"><em>[% quip FILTER html %]</em></a>
+ </span>
+[% END %]
+
+[% IF toolong %]
+ <h2 class="bz_smallminded">
+ This list is too long for Bugzilla's little mind; the
+ Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %].
+ </h2>
+[% END %]
+
+[%############################################################################%]
+[%# Page Footer #%]
+[%############################################################################%]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%##########%]
+[%# Blocks #%]
+[%##########%]
+
+[% BLOCK edit_search_url %]
+ [% editqueryname = searchname OR defaultsavename OR '' %]
+ query.cgi?[% urlquerypart FILTER html %]
+ [%- IF editqueryname != '' %]&known_name=
+ [%- editqueryname FILTER uri %]
+ [% END %]
+[% END %]
+
+[% BLOCK enter_bug_link %]
+ <a href="enter_bug.cgi
+ [%- IF one_product.defined %]?product=
+ [%- one_product.name FILTER uri %]
+ [%- IF one_component.defined %]&component=
+ [%- one_component FILTER uri %][% END %][% END %]">File
+ a new [% terms.bug %]
+ [% IF one_product.defined %]
+ in the
+ [% IF one_component.defined %]
+ "[% one_component FILTER html %]" component of the
+ [% END %]
+ "[% one_product.name FILTER html %]" product
+ [% END %]</a>
+[% END %]
diff --git a/template/en/custom/list/table.html.tmpl b/template/en/custom/list/table.html.tmpl
new file mode 100644
index 0000000..7f3ad21
--- /dev/null
+++ b/template/en/custom/list/table.html.tmpl
@@ -0,0 +1,267 @@
+[%# 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.
+ #%]
+
+[%############################################################################%]
+[%# Initialization #%]
+[%############################################################################%]
+
+[%# Don't display the table or do any processing if there are no bugs
+ # to display %]
+[% RETURN IF !bugs.size %]
+
+[%# Columns whose titles or values should be abbreviated to make the list
+ # more compact. For columns whose titles should be abbreviated,
+ # the shortened title is included. For columns whose values should be
+ # abbreviated, a maximum length is provided along with the ellipsis that
+ # should be added to an abbreviated value, if any.
+ # wrap is set if a column's contents should be allowed to be word-wrapped
+ # by the browser.
+ #%]
+
+[% field_descs.short_short_desc = field_descs.short_desc %]
+[% field_descs.assigned_to_realname = field_descs.assigned_to %]
+[% field_descs.reporter_realname = field_descs.reporter %]
+[% field_descs.qa_contact_realname = field_descs.qa_contact %]
+
+[%# Setting maxlength => 0 means no limit. We set it for performance reasons. %]
+[% abbrev =
+ {
+ "bug_severity" => { maxlength => 3 , title => "Sev" } ,
+ "priority" => { maxlength => 7 , title => "Pri" } ,
+ "rep_platform" => { maxlength => 3 , title => "HW" } ,
+ "bug_status" => { maxlength => 4 } ,
+ "assigned_to" => { maxlength => 30 , ellipsis => "..." } ,
+ "assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } ,
+ "reporter" => { maxlength => 30 , ellipsis => "..." } ,
+ "reporter_realname" => { maxlength => 20 , ellipsis => "..." } ,
+ "qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } ,
+ "qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } ,
+ "resolution" => { maxlength => 4 } ,
+ "short_desc" => { maxlength => 0, wrap => 1 } ,
+ "short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
+ "status_whiteboard" => { maxlength => 0, title => "Whiteboard" , wrap => 1 } ,
+ "keywords" => { maxlength => 0, wrap => 1 } ,
+ "tags" => { maxlength => 0, title => "Tags", wrap => 1},
+ "dependson" => { maxlength => 0, wrap => 1 } ,
+ "blocked" => { maxlength => 0, wrap => 1 } ,
+ "flagtypes.name" => { maxlength => 0, wrap => 1 } ,
+ "component" => { maxlength => 8 , title => "Comp" } ,
+ "product" => { maxlength => 12 } ,
+ "version" => { maxlength => 7 , title => "Vers" } ,
+ "op_sys" => { maxlength => 12 } ,
+ "bug_file_loc" => { maxlength => 30 } ,
+ "target_milestone" => { maxlength => 0, title => "TargetM" } ,
+ "longdescs.count" => { maxlength => 0, title => "# Comments" },
+ "percentage_complete" => { maxlength => 0, format_value => "%d %%" } ,
+ }
+%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% Hook.process("before_table") %]
+
+[%############################################################################%]
+[%# Table Header #%]
+[%############################################################################%]
+
+[% tableheader = BLOCK %]
+ <table class="bz_buglist">
+ <tr class="bz_buglist_header bz_first_buglist_header">
+ [% IF dotweak %]
+ <th> </th>
+ [% END %]
+ <th colspan="[% splitheader ? 2 : 1 %]" class="first-child">
+ <a href="buglist.cgi?
+ [% urlquerypart FILTER html %]&order=
+ [% PROCESS new_order id='bug_id' %]
+ [%-#%]&query_based_on=
+ [% defaultsavename OR searchname FILTER uri %]">ID
+ [% PROCESS order_arrow id='bug_id' ~%]
+ </a>
+ </th>
+
+ [% IF splitheader %]
+
+ [% FOREACH id = displaycolumns %]
+ [% NEXT UNLESS loop.count() % 2 == 0 %]
+ [% column = columns.$id %]
+ [% PROCESS columnheader %]
+ [% END %]
+
+ </tr><tr class="bz_buglist_header">
+ [% IF dotweak %]
+ <th> </th>
+ [% END %]
+ <th> </th>
+
+ [% FOREACH id = displaycolumns %]
+ [% NEXT IF loop.count() % 2 == 0 %]
+ [% column = columns.$id %]
+ [% PROCESS columnheader %]
+ [% END %]
+
+ [% ELSE %]
+
+ [% FOREACH id = displaycolumns %]
+ [% column = columns.$id %]
+ [% PROCESS columnheader %]
+ [% END %]
+
+ [% END %]
+
+ </tr>
+[% END %]
+
+[% BLOCK columnheader %]
+ <th colspan="[% splitheader ? 2 : 1 %]">
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]&order=
+ [% PROCESS new_order %]
+ [%-#%]&query_based_on=
+ [% defaultsavename OR searchname FILTER uri %]">
+ [%- abbrev.$id.title || field_descs.$id || column.title FILTER html -%]
+ [% PROCESS order_arrow ~%]
+ </a>
+ </th>
+[% END %]
+
+[% BLOCK new_order %]
+ [% desc = '' %]
+ [% IF (om = order.match("\\b$id( DESC)?")) %]
+ [% desc = ' DESC' IF NOT om.0 %]
+ [% END %]
+ [% id _ desc FILTER uri %]
+ [% IF id != 'bug_id' AND order %]
+ [% ',' _ order.remove("\\b$id( DESC)?(,\\s*|\$)") FILTER uri %]
+ [% END %]
+[% END %]
+
+[% BLOCK order_arrow %]
+ [% IF order.search("^$id DESC") %]
+ <span class="bz_sort_order_primary">▼</span>
+ [% ELSIF order.search("^$id(,\\s*|\$)") %]
+ <span class="bz_sort_order_primary">▲</span>
+ [% ELSIF order.search("\\b$id DESC") %]
+ <span class="bz_sort_order_secondary">▼</span>
+ [% ELSIF order.search("\\b$id(,\\s*|\$)") %]
+ <span class="bz_sort_order_secondary">▲</span>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table #%]
+[%############################################################################%]
+
+[% tableheader %]
+
+[% FOREACH bug = bugs %]
+ [% count = loop.count() %]
+
+ <tr id="b[% bug.bug_id %]" class="bz_bugitem
+ bz_[% bug.bug_severity FILTER css_class_quote -%]
+ bz_[% bug.priority FILTER css_class_quote -%]
+ bz_[% bug.bug_status FILTER css_class_quote -%]
+ [%+ "bz_$bug.resolution" FILTER css_class_quote IF bug.resolution -%]
+ [%+ "bz_secure" IF bug.secure_mode -%]
+ [%+ "bz_secure_mode_$bug.secure_mode" FILTER css_class_quote IF bug.secure_mode -%]
+ [%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]
+ ">
+
+ [% IF dotweak %]
+ <td class="bz_checkbox_column">
+ <input type="checkbox" name="id_[% bug.bug_id %]">
+ </td>
+ [% END %]
+ <td class="first-child bz_id_column">
+ <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>
+ <span class="bz_default_hidden">[%+ '[SEC]' IF bug.secure_mode %]</span>
+ </td>
+
+ [% FOREACH column = displaycolumns %]
+ [% col_abbrev = abbrev.$column %]
+ <td class="bz_[% column FILTER css_class_quote %]_column
+ [%~ ' nowrap' UNLESS col_abbrev.wrap
+ OR bug_fields.$column.type == constants.FIELD_TYPE_FREETEXT
+ OR bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %]">
+ [% IF col_abbrev.maxlength %]
+ <span title="[%- display_value(column, bug.$column) FILTER html %]">
+ [% END %]
+ [% IF col_abbrev.format_value %]
+ [%- bug.$column FILTER format(col_abbrev.format_value) FILTER html -%]
+ [% ELSIF column == 'actual_time' ||
+ column == 'remaining_time' ||
+ column == 'estimated_time' %]
+ [% PROCESS formattimeunit time_unit=bug.$column %]
+ [%# Display the login name of the user if their real name is empty. %]
+ [% ELSIF column.search('_realname$') && bug.$column == '' %]
+ [% SET login_column = column.remove('_realname$') %]
+ [% bug.${login_column}.truncate(col_abbrev.maxlength,
+ col_abbrev.ellipsis) FILTER html %]
+ [% ELSIF column == 'short_desc' || column == "short_short_desc" %]
+ <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">
+ [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+ </a>
+ [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_BUG_ID %]
+ <a href="show_bug.cgi?id=[% bug.$column FILTER html %]">
+ [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+ </a>
+ [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %]
+ [%- bug.$column.truncate(256, '...') FILTER html -%]
+ [% ELSIF column == 'bug_file_loc' && is_safe_url(bug.bug_file_loc) %]
+ <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
+ rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]">
+ [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+ </a>
+ [% ELSE %]
+ [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%]
+ [% END %]
+ [% IF col_abbrev.maxlength %]
+ </span>
+ [% END %]
+ </td>
+ [% END %]
+
+ </tr>
+[% END %]
+
+[% IF time_info.time_present %]
+ [% PROCESS time_summary_line %]
+[% END %]
+
+</table>
+
+[% BLOCK time_summary_line %]
+ <tr class="bz_time_summary_line">
+ [% columns_to_span = 1 %] [%# bugID %]
+ [% IF dotweak %]
+ [% columns_to_span = columns_to_span + 1 %]
+ [% END %]
+ [% FOREACH column = displaycolumns %]
+ [% IF column == 'actual_time' ||
+ column == 'remaining_time' ||
+ column == 'estimated_time' ||
+ column == 'percentage_complete' %]
+ [% IF columns_to_span > 0 %]
+ <td class="bz_total bz_total_label" colspan="
+ [%- columns_to_span FILTER html %]"><b>Totals</b></td>
+ [% columns_to_span = 0 %]
+ [% END %]
+ [% IF column == 'percentage_complete' %]
+ <td class="bz_total">[% time_info.percentage_complete
+ FILTER format(abbrev.$column.format_value) FILTER html %]</td>
+ [% ELSE %]
+ <td class="bz_total">
+ [%- PROCESS formattimeunit time_unit=time_info.$column %]</td>
+ [% END %]
+ [% ELSIF columns_to_span == 0 %] [%# A column following the first total %]
+ <td class="bz_total"> </td>
+ [% ELSE %] [%# We haven't gotten to a time column yet, keep computing span %]
+ [% columns_to_span = columns_to_span + 1 %]
+ [% END %]
+ [% END %]
+ </tr>
+[% END %]
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list