diff options
author | lpsolit%gmail.com <> | 2008-09-11 02:07:01 +0200 |
---|---|---|
committer | lpsolit%gmail.com <> | 2008-09-11 02:07:01 +0200 |
commit | 4fdb67308b0e095aa76e36581cc4e94357d61f6a (patch) | |
tree | 929dd29f66aa2aac4d312c589771ee8c13699349 | |
parent | 93e808dbc5e703df7318e18f048710f19fc8e92c (diff) | |
download | bugzilla-4fdb67308b0e095aa76e36581cc4e94357d61f6a.tar.gz bugzilla-4fdb67308b0e095aa76e36581cc4e94357d61f6a.tar.xz |
Bug 216557: Be able to specify the order of the columns in a bug list - Patch by Pascal Held <paheld+bugzilla@gmail.com> r=LpSolit r=pyrzak a=LpSolit
-rwxr-xr-x | colchange.cgi | 8 | ||||
-rw-r--r-- | js/change-columns.js | 145 | ||||
-rw-r--r-- | skins/standard/global.css | 26 | ||||
-rw-r--r-- | skins/standard/global/down.png | bin | 0 -> 335 bytes | |||
-rw-r--r-- | skins/standard/global/left.png | bin | 0 -> 339 bytes | |||
-rw-r--r-- | skins/standard/global/right.png | bin | 0 -> 339 bytes | |||
-rw-r--r-- | skins/standard/global/up.png | bin | 0 -> 318 bytes | |||
-rw-r--r-- | skins/standard/show_bug.css | 4 | ||||
-rw-r--r-- | template/en/default/filterexceptions.pl | 4 | ||||
-rw-r--r-- | template/en/default/list/change-columns.html.tmpl | 61 |
10 files changed, 227 insertions, 21 deletions
diff --git a/colchange.cgi b/colchange.cgi index cb43b34e3..5c44df3ed 100755 --- a/colchange.cgi +++ b/colchange.cgi @@ -21,6 +21,7 @@ # Contributor(s): Terry Weissman <terry@mozilla.org> # Gervase Markham <gerv@gerv.net> # Max Kanat-Alexander <mkanat@bugzilla.org> +# Pascal Held <paheld@gmail.com> use strict; @@ -94,10 +95,9 @@ if (defined $cgi->param('rememberedquery')) { if (defined $cgi->param('resetit')) { @collist = DEFAULT_COLUMN_LIST; } else { - foreach my $i (@masterlist) { - if (defined $cgi->param("column_$i")) { - push @collist, $i; - } + if (defined $cgi->param("selected_columns")) { + my %legal_list = map { $_ => 1 } @masterlist; + @collist = grep { exists $legal_list{$_} } $cgi->param("selected_columns"); } if (defined $cgi->param('splitheader')) { $splitheader = $cgi->param('splitheader')? 1: 0; diff --git a/js/change-columns.js b/js/change-columns.js new file mode 100644 index 000000000..5fd5c1085 --- /dev/null +++ b/js/change-columns.js @@ -0,0 +1,145 @@ +/*# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Pascal Held. + # + # Contributor(s): Pascal Held <paheld@gmail.com> + # +*/ + +function initChangeColumns() { + window.onunload = unload; + var av_select = document.getElementById("available_columns"); + var sel_select = document.getElementById("selected_columns"); + document.getElementById("avail_header").style.display = "inline"; + document.getElementById("available_columns").style.display = "inline"; + document.getElementById("select_button").style.display = "inline"; + document.getElementById("deselect_button").style.display = "inline"; + document.getElementById("up_button").style.display = "inline"; + document.getElementById("down_button").style.display = "inline"; + switch_options(sel_select, av_select, false); + sel_select.selectedIndex = -1; + updateView(); +} + +function switch_options(from_box, to_box, selected) { + for (var i = 0; i<from_box.options.length; i++) { + var opt = from_box.options[i]; + if (opt.selected == selected) { + var newopt = new Option(opt.text, opt.value, opt.defaultselected, opt.selected); + to_box.options[to_box.options.length] = newopt; + from_box.options[i] = null; + i = i - 1; + } + + } +} + +function move_select() { + var av_select = document.getElementById("available_columns"); + var sel_select = document.getElementById("selected_columns"); + switch_options(av_select, sel_select, true); + updateView(); +} + +function move_deselect() { + var av_select = document.getElementById("available_columns"); + var sel_select = document.getElementById("selected_columns"); + switch_options(sel_select, av_select, true); + updateView(); +} + +function move_up() { + var sel_select = document.getElementById("selected_columns"); + var last = sel_select.options[0]; + var dummy = new Option("", "", false, false); + for (var i = 1; i<sel_select.options.length; i++) { + var opt = sel_select.options[i]; + if (opt.selected) { + sel_select.options[i] = dummy; + sel_select.options[i-1] = opt; + sel_select.options[i] = last; + } + else{ + last = opt; + } + } + updateView(); +} + +function move_down() { + var sel_select = document.getElementById("selected_columns"); + var last = sel_select.options[sel_select.options.length-1]; + var dummy = new Option("", "", false, false); + for (var i = sel_select.options.length-2; i >= 0; i--) { + var opt = sel_select.options[i]; + if (opt.selected) { + sel_select.options[i] = dummy; + sel_select.options[i + 1] = opt; + sel_select.options[i] = last; + } + else{ + last = opt; + } + } + updateView(); +} + +function updateView() { + var select_button = document.getElementById("select_button"); + var deselect_button = document.getElementById("deselect_button"); + var up_button = document.getElementById("up_button"); + var down_button = document.getElementById("down_button"); + select_button.disabled = true; + deselect_button.disabled = true; + up_button.disabled = true; + down_button.disabled = true; + var av_select = document.getElementById("available_columns"); + var sel_select = document.getElementById("selected_columns"); + for (var i = 0; i < av_select.options.length; i++) { + if (av_select.options[i].selected) { + select_button.disabled = false; + break; + } + } + for (var i = 0; i < sel_select.options.length; i++) { + if (sel_select.options[i].selected) { + deselect_button.disabled = false; + up_button.disabled = false; + down_button.disabled = false; + break; + } + } + if (sel_select.options.length > 0) { + if (sel_select.options[0].selected) { + up_button.disabled = true; + } + if (sel_select.options[sel_select.options.length - 1].selected) { + down_button.disabled = true; + } + } +} + +function change_submit() { + var sel_select = document.getElementById("selected_columns"); + for (var i = 0; i < sel_select.options.length; i++) { + sel_select.options[i].selected = true; + } + return false; +} + +function unload() { + var sel_select = document.getElementById("selected_columns"); + for (var i = 0; i < sel_select.options.length; i++) { + sel_select.options[i].selected = true; + } +} diff --git a/skins/standard/global.css b/skins/standard/global.css index 938575eb5..f3dd2ffbe 100644 --- a/skins/standard/global.css +++ b/skins/standard/global.css @@ -20,6 +20,7 @@ * Vitaly Harisov <vitaly@rathedg.com> * Svetlana Harisova <light@rathedg.com> * Marc Schumann <wurblzap@gmail.com> + * Pascal Held <paheld@gmail.com> */ /* global (begin) */ @@ -271,6 +272,10 @@ div#docslinks { padding: 1em 0; } +.bz_default_hidden { + display: none; +} + span.quote { color: #65379c; /* Make quoted text not wrap. */ @@ -439,4 +444,25 @@ form#Create .comment { background: white; } +.image_button { + background-repeat: no-repeat; + background-position: center center; + width: 30px; + display: none; +} + +#select_button { + background-image: url(global/right.png); +} + +#deselect_button { + background-image: url(global/left.png); +} + +#up_button { + background-image: url(global/up.png); +} +#down_button { + background-image: url(global/down.png); +}
\ No newline at end of file diff --git a/skins/standard/global/down.png b/skins/standard/global/down.png Binary files differnew file mode 100644 index 000000000..78a9e631a --- /dev/null +++ b/skins/standard/global/down.png diff --git a/skins/standard/global/left.png b/skins/standard/global/left.png Binary files differnew file mode 100644 index 000000000..f8cb2b2dd --- /dev/null +++ b/skins/standard/global/left.png diff --git a/skins/standard/global/right.png b/skins/standard/global/right.png Binary files differnew file mode 100644 index 000000000..d02b707a6 --- /dev/null +++ b/skins/standard/global/right.png diff --git a/skins/standard/global/up.png b/skins/standard/global/up.png Binary files differnew file mode 100644 index 000000000..240d483df --- /dev/null +++ b/skins/standard/global/up.png diff --git a/skins/standard/show_bug.css b/skins/standard/show_bug.css index 3851315da..80c4513d6 100644 --- a/skins/standard/show_bug.css +++ b/skins/standard/show_bug.css @@ -11,10 +11,6 @@ width: 2em; } -.bz_default_hidden { - display: none; -} - .related_actions { font-size: 0.85em; float: right; diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl index 361a1f469..9ac1b4339 100644 --- a/template/en/default/filterexceptions.pl +++ b/template/en/default/filterexceptions.pl @@ -177,10 +177,6 @@ 'default.series_id', ], -'list/change-columns.html.tmpl' => [ - 'column', -], - 'list/edit-multiple.html.tmpl' => [ 'group.id', 'menuname', diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl index 88ae47818..53d0493ef 100644 --- a/template/en/default/list/change-columns.html.tmpl +++ b/template/en/default/list/change-columns.html.tmpl @@ -16,12 +16,15 @@ # Rights Reserved. # # Contributor(s): Dave Lawrence <dkl@redhat.com> + # Pascal Held <paheld@gmail.com> #%] [% PROCESS global/variables.none.tmpl %] [% PROCESS global/header.html.tmpl title = "Change Columns" + javascript_urls = "js/change-columns.js" + onload = "initChangeColumns()" %] <p> @@ -36,16 +39,56 @@ [% field_descs.reporter_realname = "Reporter Realname" %] [% field_descs.qa_contact_realname = "QA Contact Realname" %] -<form action="colchange.cgi"> +<form name="changecolumns" action="colchange.cgi" onsubmit="change_submit();"> <input type="hidden" name="rememberedquery" value="[% buffer FILTER html %]"> - [% FOREACH column = masterlist %] - <input type="checkbox" id="[% column %]" name="column_[% column %]" - [%+ "checked='checked'" IF lsearch(collist, column) != -1 %]> - <label for="[% column %]"> - [% (field_descs.${column} || column) FILTER html %] - </label> - <br> - [% END %] + <table> + <tr> + <th><div id="avail_header" class="bz_default_hidden">Available Columns</div></th> + <th></th> + <th>Selected Columns</th> + <th></th> + </tr> + <tr> + <td> + <select name="available_columns" id="available_columns" + size="15" multiple="multiple" onchange="updateView();" + class="bz_default_hidden"> + </select> + </td> + <td> + <input class="image_button" type="button" id="select_button" + name="select" onclick="move_select()"> + <br><br> + <input class="image_button" type="button" id="deselect_button" + name="deselect" onclick="move_deselect()"> + </td> + <td> + <select name="selected_columns" id="selected_columns" + size="15" multiple="multiple" onchange="updateView();"> + [% FOREACH column = collist %] + <option value="[% column FILTER html %]" selected="selected"> + [% (field_descs.${column} || column) FILTER html %] + </option> + [% END %] + [% FOREACH column = masterlist %] + [% IF lsearch(collist, column) == -1 %] + <option value="[% column FILTER html %]"> + [% (field_descs.${column} || column) FILTER html %] + </option> + [% END %] + [% END %] + </select> + </td> + <td> + <input class="image_button" type="button" id="up_button" + name="up" onclick="move_up()"> + <br><br> + <input class="image_button" type="button" id="down_button" + name="down" onclick="move_down()"> + </td> + </tr> + </table> + </center> <p> <input id="nosplitheader" type="radio" name="splitheader" value="0" |