source: trunk/www/common/columns/configure.jsp @ 3077

Last change on this file since 3077 was 3077, checked in by Nicklas Nordborg, 16 years ago

Fixes #431: Multiple tables from the Table taglib on the same HTML page interfere with each other

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 9.9 KB
Line 
1<%-- $Id: configure.jsp 3077 2007-01-22 13:15:31Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 2
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330,
21  Boston, MA  02111-1307, USA.
22  ------------------------------------------------------------------
23
24  Configure the order and visibility of columns in a table of items.
25  This page will use the TableColumn.getTableColumns(item) to retreive the
26  list of all available columns for that item type and
27  getSession().getSetting(item+".columns") to retreive a comma-separated
28  list of the current order of visible columns.
29
30  @param item The type of items in the table
31
32  @author Nicklas
33  @version 2.0
34--%>
35<%@ page session="false"
36  import="net.sf.basedb.core.SessionControl"
37  import="net.sf.basedb.core.Item"
38  import="net.sf.basedb.core.ItemContext"
39  import="net.sf.basedb.util.Enumeration"
40  import="net.sf.basedb.clients.web.util.HTML"
41  import="net.sf.basedb.util.Values"
42  import="net.sf.basedb.clients.web.Base"
43  import="java.util.Set"
44  import="java.util.TreeSet"
45%>
46<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
47<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
48
49<%
50final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
51final String ID = sc.getId();
52final Item itemType = Item.valueOf(request.getParameter("item_type"));
53final String subContext = Values.getString(request.getParameter("subcontext"), "");
54final String tableId = request.getParameter("table_id");
55final String defaultColumns = request.getParameter("default");
56
57%>
58  <base:page type="popup" title="Set column order and visibility">
59  <base:head>
60    <script language="JavaScript">
61    var tableId = '<%=tableId%>';
62
63    // Initialise the visible and hidden column lists
64    function initColumns(columns)
65    {
66      var frm = document.forms['columns'];
67      var visible = frm.visible;
68      var hidden = frm.hidden;
69      visible.length = 0;
70      hidden.length = 0; 
71
72      // The visibled columns (comma-separated)
73      var allVisible = columns == 'all';
74      var visibleCols = columns.split(',');
75
76      // All column definitions
77      var columnDefs = window.opener.Table.getColumnDefs(tableId);
78
79      // Put all column in the hidden or visible list
80      var toList = allVisible ? visible : hidden;
81      for (var i = 0; i < columnDefs.length; i++) 
82      {
83        var col = columnDefs[i];
84        if (!col.alwaysHide) addCol(toList, col);
85      }
86     
87      // Move visible columns to the visible list
88      if (!allVisible)
89      {
90        for (var i = 0; i < visibleCols.length; i++)
91        {
92          var colId = visibleCols[i];
93          var col = columnDefs['id'+colId];
94          for (var j = 0; j < hidden.length; j++)
95          {
96            if (hidden[j].value == colId)
97            {
98              addCol(visible, col);
99              hidden[j] = null;
100              j = hidden.length;
101            }
102          }
103        }
104       
105        // Move columns that must be visible to the visible list
106        for (var i = 0; i < hidden.length; i++)
107        {
108          var col = columnDefs['id'+hidden.options[i].value];
109          if (col && col.alwaysShow)
110          {
111            addCol(visible, col);
112            hidden[i] = null; 
113            i--;
114          }
115        }
116      }
117    }
118   
119    function addCol(toList, col)
120    {
121      var option = new Option(col.title, col.id);
122      if (col.alwaysShow)
123      {
124        option.style.fontWeight = 'bold';
125        option.text = option.text+' ×';
126      }
127      toList[toList.length] = option;
128    }
129
130    // Moves all selected items in list1 to list2
131    function moveBetween(list1, list2)
132    {
133      var moved = 0;
134      var columnDefs = window.opener.Table.getColumnDefs(tableId);
135      for(i=0; i < list1.options.length; i++) // >
136      {
137        if (list1.options[i].selected)
138        {
139          var col = columnDefs['id'+list1.options[i].value];
140          if (col.alwaysShow)
141          {
142            alert("'" + col.title + "' must always be visible");
143          }
144          else
145          {
146            moved++;
147            list2.options[list2.options.length] = new Option(list1.options[i].text, list1.options[i].value, false, true);
148            list1.options[i] = null;
149            i--;
150          }
151        }
152      }
153      if (moved > 0) clearPreset();
154    }
155   
156    // Move all selected items in the list up or down
157    function moveSelected(list, up)
158    {
159      var moved = Forms.moveListOptions(list, up);
160      if (moved > 0) clearPreset();
161    }
162   
163    // Sets the preset selection list to the first (empty) element
164    function clearPreset()
165    {
166      var frm = document.forms['columns'];
167      frm.presets.selectedIndex = 0;
168    }
169   
170    // Update the settings according to the selection in the presets list
171    function updateColumns()
172    {
173      var frm = document.forms['columns'];
174      var presets = frm.presets;
175      var columns = presets.options[presets.selectedIndex].value;
176      if (columns == '') return;
177      if (columns == '_default_') columns = '<%=defaultColumns%>';
178      if (columns == '_current_') columns = window.opener.Table.getColumns('<%=tableId%>');
179      if (columns == '_minimal_')
180      {
181        var columnDefs = window.opener.Table.getColumnDefs(tableId);
182        var temp = new Array();
183        for (var i = 0; i < columnDefs.length; i++) // >
184        {
185          var col = columnDefs[i];
186          var option = new Option(col.title, col.id);
187          if (col.alwaysShow) temp[temp.length] = col.id;
188        }
189        columns = temp.join(',');
190      }
191      initColumns(columns);
192    }
193   
194    function savePresetAs()
195    {
196      var selected = getVisibleColumns();
197      Main.openPopup('save_preset.jsp?ID=<%=ID%>&item_type=<%=itemType.name()%>&subcontext=<%=subContext%>&columns='+selected, 'SavePreset', 360, 200);
198    }
199   
200    // Save the configuration to the parent window
201    function saveColumns()
202    {
203      var selected = getVisibleColumns()
204      window.opener.Table.setColumns('<%=tableId%>', selected);
205      window.close();
206    }
207   
208    // Get all visible columns as a comma-separated string
209    function getVisibleColumns()
210    {
211      var list = document.forms['columns'].visible;
212      var selected = '';
213      for (var i = 0; i < list.options.length; i++)
214      {
215        if (i > 0) selected += ',';
216        selected += list.options[i].value;
217      }
218      return selected;
219    }
220    </script>
221  </base:head>
222  <base:body onload="<%="initColumns(window.opener.Table.getColumns('"+tableId+"'))"%>">
223    <form name="columns" onsubmit="return false;">
224 
225    <h3 class="docked">Set column order and visiblity <base:help helpid="columns.configure" /></h3>
226    <div class="boxed" align="center">
227    <table border=0 cellspacing=0 cellpadding=2 width="100%">
228    <tr>
229      <td style="vertical-align: middle">
230        <br>
231        <base:button
232          onclick="moveSelected(document.forms['columns'].visible, false)" 
233          title="<img src='../../images/move_up.gif' alt='' style='vertical-align: middle;'>" 
234          tooltip="Move up" 
235        /><p>
236        <base:button 
237          onclick="moveSelected(document.forms['columns'].visible, true)" 
238          title="<img src='../../images/move_down.gif' alt='' style='vertical-align: middle;'>" 
239          tooltip="Move down" 
240        />
241        <br>
242      </td>
243 
244      <td width="50%">
245        <b>Visible columns</b><br>
246        <select name="visible" multiple size="14" style="width: 100%;" 
247          ondblclick="moveBetween(document.forms['columns'].visible, document.forms['columns'].hidden)">
248        </select>
249      </td>
250 
251      <td style="vertical-align: middle">
252         <br>
253        <base:button
254          onclick="moveBetween(document.forms['columns'].hidden, document.forms['columns'].visible)" 
255          title="<img src='../../images/move_left.gif' alt='' style='vertical-align: middle;'>" 
256          tooltip="Make the selected hidden column(s) visible" 
257        /><p>
258        <base:button 
259          onclick="moveBetween(document.forms['columns'].visible, document.forms['columns'].hidden)" 
260          title="<img src='../../images/move_right.gif' alt='' style='vertical-align: middle;'>" 
261          tooltip="Make the selected visible column(s) hidden" 
262        />
263        <br>
264      </td>
265 
266      <td width="50%">
267        <b>Hidden columns</b><br>
268        <select name="hidden" multiple size="14" style="width: 100%;" 
269          ondblclick="moveBetween(document.forms['columns'].hidden, document.forms['columns'].visible)">
270        </select>
271      </td>
272    </tr>
273    <tr>
274      <td>&nbsp;</td>
275      <td colspan="3">
276        <div align="right">
277          <b>×</b> = This column cannot be hidden
278        </div>
279        <center>
280        <table>
281        <tr>
282        <td>
283          <b>Presets</b><br>
284          <select name="presets" onChange="updateColumns()">
285            <option value="">-- predefined --
286            <option value="all">All
287            <option value="_minimal_">Required
288            <option value="_current_">Current
289            <%
290            if (defaultColumns != null)
291            {
292              %>
293              <option value="_default_">Default
294              <%
295            }
296            %>
297            <option value="">-- user defined --
298            <%
299            Enumeration<Integer, String> contexts = sc.getContextNames(itemType, subContext);
300            for (int i = 0; i < contexts.size(); ++i)
301            {
302              ItemContext context = sc.getContext(contexts.getKey(i));
303              if (context != null && !ItemContext.DEFAULT_NAME.equals(context.getName()))
304              {
305                String columns = context.getSetting("columns");
306                %>
307                <option value="<%=columns%>"><%=HTML.encodeTags(context.getName())%>
308                <%
309              }
310            }
311            %>
312          </select>
313          </td>
314          <%
315          if (request.getParameter("nosavedelete") == null)
316          {
317            %>
318            <td><br><base:button onclick="savePresetAs();" title="Save as&hellip;" /></td>
319            <%
320          }
321          %>
322        </tr>
323        </table>
324        </center>
325      </td>
326    </tr>
327    </table>
328    </div>
329    </form>
330    <table align="center">
331    <tr>
332      <td width="50%"><base:button onclick="saveColumns();" title="Ok" /></td>
333      <td width="50%"><base:button onclick="window.close();" title="Cancel" /></td>
334    </tr>
335    </table>
336  </base:body>
337  </base:page>
338
Note: See TracBrowser for help on using the repository browser.