source: trunk/www/views/experiments/spotdata/list_spotdata.jsp @ 7913

Last change on this file since 7913 was 7913, checked in by Nicklas Nordborg, 8 months ago

Fixes #2241: Column subtitles in table listings

Fixed in all list pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 15.1 KB
Line 
1<%-- $Id: list_spotdata.jsp 7913 2021-02-22 07:16:45Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
4  Copyright (C) 2007 Johan Enell
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@page import="net.sf.basedb.clients.web.extensions.plot.OverviewPlotAction"%>
27<%@ page pageEncoding="UTF-8" session="false"
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.Type"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.Permission"
34  import="net.sf.basedb.core.Experiment"
35  import="net.sf.basedb.core.BioAssaySet"
36  import="net.sf.basedb.core.BioAssay"
37  import="net.sf.basedb.core.RawDataType"
38  import="net.sf.basedb.core.BaseException"
39  import="net.sf.basedb.core.DynamicResultIterator"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.Formula"
42  import="net.sf.basedb.core.IntensityTransform"
43  import="net.sf.basedb.core.plugin.GuiContext"
44  import="net.sf.basedb.core.plugin.Plugin"
45  import="net.sf.basedb.core.query.SqlQuery"
46  import="net.sf.basedb.core.query.SqlResult"
47  import="net.sf.basedb.util.Enumeration"
48  import="net.sf.basedb.util.ColorGenerator"
49  import="net.sf.basedb.util.formatter.LookupFormatter"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.ModeInfo"
52  import="net.sf.basedb.clients.web.DynamicUtil"
53  import="net.sf.basedb.clients.web.WebException"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.clients.web.taglib.table.TableColumn"
57  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
58  import="net.sf.basedb.clients.web.extensions.JspContext"
59  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
60  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
61  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
62  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
63  import="java.util.Map"
64  import="java.util.HashMap"
65  import="java.util.List"
66  import="java.util.LinkedList"
67  import="java.util.ArrayList"
68  import="java.util.Set"
69  import="java.util.HashSet"
70  import="java.util.Arrays"
71  import="java.awt.Color"
72%>
73<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
74<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
75<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
76<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
77<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
78<%!
79  private static final Item itemType = Item.SPOTDATA;
80  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
81%>
82<%
83final int bioAssayId = Values.getInt(request.getParameter("bioassay_id"));
84final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));
85final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
86final String ID = sc.getId();
87
88final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
89final String callback = request.getParameter("callback");
90final String title = mode.generateTitle("spot data", "spot data");
91final DbControl dc = sc.newDbControl();
92DynamicResultIterator spotData = null;
93try
94{
95  final BioAssay bioAssay = bioAssayId == 0 ? null : BioAssay.getById(dc, bioAssayId);
96  final BioAssaySet bioAssaySet = bioAssay != null ? bioAssay.getBioAssaySet() : BioAssaySet.getById(dc, bioAssaySetId);
97  final Experiment experiment = bioAssaySet.getExperiment();
98  final int experimentId = experiment.getId();
99  final RawDataType rawDataType = bioAssaySet.getRawDataType();
100  final IntensityTransform transform = bioAssaySet.getIntensityTransform();
101 
102  final String subContext = rawDataType.getId();
103  final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
104  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
105 
106  List<TableColumn> columns = new LinkedList<TableColumn>();
107  DynamicUtil.addSpotColumns(columns, dc, rawDataType.getChannels(), transform);
108  DynamicUtil.addFormulaColumns(columns, dc, rawDataType, Formula.Type.COLUMN_EXPRESSION, 
109      transform, "frm.", "[Formula] ", true);
110  DynamicUtil.addExtraColumns(columns, dc, bioAssaySet, "ev", "#", "[Xtra] ");
111  DynamicUtil.addRawDataColumns(columns, dc, rawDataType, "raw.", "$", "[Raw] ");
112  DynamicUtil.addReporterColumns(columns, dc, experiment.getVirtualDb().getReporterCloneTemplate(), "rep.", "@", "[Rep] ");
113  DynamicUtil.SelectedInfo selected = DynamicUtil.getSelectedColumns(cc, columns, false);
114 
115  int externalIdColumn = selected.selectedIds.indexOf("rep.externalId") + 1;
116  int reporterIdColumn = selected.selectedIds.indexOf("rep.id") + 1;
117  if (reporterIdColumn <= 0 && externalIdColumn > 0)
118  {
119    // Force selecting reporter id column if external id is selected
120    selected.selectedIds.add("rep.id");
121    selected.selectedProperties.add("@id");
122    reporterIdColumn = selected.selectedIds.size();
123  }
124  if (bioAssay == null && cc.getSetting("columns").indexOf("COLUMN") >= 0) 
125  {
126    selected.selectedIds.add("COLUMN");
127    selected.selectedProperties.add("COLUMN");
128  }
129  try
130  {
131    final SqlQuery query = bioAssay != null ? bioAssay.getSpotData() : bioAssaySet.getSpotData();
132    cc.configureQuery(dc, query, selected.selectedProperties);
133    query.setFailSafe(true);
134    spotData = query.iterate(dc);
135  }
136  catch (Throwable t)
137  {
138    cc.setMessage(t.getMessage());
139    t.printStackTrace();
140  }
141
142  int numListed = 0;
143  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
144    guiContext, bioAssay == null ? bioAssaySet : bioAssay);
145  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
146  ExtensionsInvoker<OverviewPlotAction> overviewPlotInvoker = bioAssay != null ? 
147    null : ExtensionsControl.useExtensions(jspContext, "net.sf.basedb.clients.web.bioassayset.overviewplots");
148  %>
149  <base:page title="<%=title%>">
150  <base:head scripts="table.js,tabcontrol-2.js,~spotdata.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
151    <ext:scripts context="<%=jspContext%>" />
152    <ext:stylesheets context="<%=jspContext%>" />
153  </base:head>
154  <base:body>
155    <p:path>
156      <p:pathelement 
157        title="Experiments" href="<%="../index.jsp?ID="+ID%>" 
158      /><p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
159        href="<%="../bioassaysets/index.jsp?ID="+ID+"&amp;experiment_id="+experiment.getId()%>" 
160      /><%
161      if (bioAssay == null)
162      {
163        %><p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" 
164        /><%
165      }
166      else
167      {
168        %><p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" 
169          href="<%="../bioassays/index.jsp?ID="+ID+"&amp;bioassayset_id="+bioAssaySet.getId()%>" 
170        /><p:pathelement title="<%=HTML.encodeTags(bioAssay.getName())%>" 
171        /><%
172      }
173      %></p:path>
174
175    <t:tabcontrol 
176      id="main" 
177      subclass="mastertabcontrol content"
178      active="spotdata">
179    <t:tab id="bioassayset.properties" title="Properties" visible="<%=bioAssay == null%>"/>
180    <t:tab id="bioassay.properties" title="Properties" visible="<%=bioAssay != null%>"/>
181
182    <t:tab id="bioassayset.annotations" title="Annotations" 
183        tooltip="View annotation values" visible="<%=bioAssay == null%>" />
184    <t:tab id="bioassay.annotations" title="Annotations" 
185      tooltip="View annotation values" visible="<%=bioAssay != null%>" />
186
187    <t:tab id="bioassays" visible="<%=bioAssay == null%>" title="BioAssays" />
188    <t:tab id="spotdata" title="Spot data" >
189    <tbl:table 
190      id="spotdata" 
191      columns="<%=cc.getSetting("columns")%>"
192      sortby="<%=cc.getSortProperty()%>" 
193      direction="<%=cc.getSortDirection()%>"
194      action="index.jsp"
195      sc="<%=sc%>"
196      item="<%=itemType%>"
197      subcontext="<%=subContext%>"
198      filterrows="<%=cc.getFilterRows()%>"
199      subclass="fulltable"
200      >
201      <tbl:hidden 
202        name="mode" 
203        value="<%=mode.getName()%>" 
204      />
205      <tbl:hidden 
206        name="bioassayset_id" 
207        value="<%=String.valueOf(bioAssaySetId)%>" 
208      />
209      <tbl:hidden 
210        name="bioassay_id" 
211        value="<%=String.valueOf(bioAssayId)%>" 
212      />
213      <tbl:hidden 
214        name="callback" 
215        value="<%=callback%>" 
216        skip="<%=callback == null%>" 
217      />
218      <%
219      for (TableColumn tc : columns)
220      {
221        %>
222        <tbl:columndef
223          id="<%=tc.getId()%>"
224          property="<%=tc.getProperty()%>"
225          tooltip="<%=tc.getDescription()%>"
226          datatype="<%=tc.getDatatype().getStringValue()%>"
227          title="<%=HTML.encodeTags(tc.getTitle())%>"
228          sortable="<%=tc.getSortable()%>"
229          filterable="<%=tc.getFilterable()%>"
230          exportable="<%=tc.getExportable()%>"
231          show="<%=tc.getShow()%>"
232          formatter="<%=tc.getFormatter()%>"
233        />
234        <%
235      }
236      %>
237      <%
238      if (bioAssay == null)
239      {
240        Map<Number, String> bioAssayMap = new HashMap<Number, String>();
241        Enumeration<String, String> bioAssayEnum = new Enumeration<String, String>();
242        for (BioAssay ba : bioAssaySet.getBioAssays().list(dc))
243        {
244          short columnNo = ba.getDataCubeColumnNo();
245          String linkedBioAssay = Base.getLinkedName(ID, ba, false, true);
246          // Safety measure, since JDBC driver seems to return 'short' as 'int'
247          bioAssayMap.put(columnNo, linkedBioAssay);
248          bioAssayMap.put((int)columnNo, linkedBioAssay);
249          bioAssayEnum.add(String.valueOf(columnNo), HTML.encodeTags(ba.getName()));
250        }
251        %>
252        <tbl:columndef
253          id="COLUMN"
254          property="COLUMN"
255          datatype="int"
256          title="Bioassay"
257          sortable="true"
258          filterable="true"
259          exportable="true"
260          enumeration="<%=bioAssayEnum%>"
261          formatter="<%=new LookupFormatter<Number>(bioAssayMap)%>"
262        />
263        <%
264      }
265      %>
266      <tbl:columndef 
267        id="reporterList"
268        property="£reporterList"
269        datatype="int"
270        title="Reporter list"
271        filterable="true"
272        enumeration="<%=Base.getReporterListsEnum(dc)%>"
273        multiple="false"
274      />
275      <div class="panelgroup bg-filled-50 bottomborder">
276        <tbl:toolbar
277          subclass="bottomborder"
278          visible="<%=mode.hasToolbar()%>"
279          >
280          <tbl:button 
281            id="btnColumns"
282            image="columns.png" 
283            title="Columns&hellip;" 
284            tooltip="Show, hide and re-order columns" 
285          />
286          <tbl:button
287            id="btnNewReporterList"
288            image="add.png"
289            title="New reporter list&hellip;"
290            tooltip="Create a new reporter list from matching spots"
291            visible="<%=sc.hasPermission(Permission.CREATE, Item.REPORTERLIST)%>"
292          />
293          <tbl:button 
294            id="btnExport"
295            data-plugin-type="EXPORT"
296            image="export.png" 
297            title="Export&hellip;" 
298            tooltip="Export data" 
299            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
300          />
301          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
302            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
303        </tbl:toolbar>
304        <tbl:panel>
305          <tbl:presetselector />
306          <tbl:navigator
307            page="<%=cc.getPage()%>" 
308            rowsperpage="<%=cc.getRowsPerPage()%>" 
309            totalrows="<%=spotData == null ? 0 : spotData.getTotalCount()%>" 
310            visible="<%=mode.hasNavigator()%>"
311          />
312        </tbl:panel>
313      </div>
314      <tbl:data>
315        <tbl:headers>
316          <tbl:headerrow>
317            <tbl:header 
318              clazz="index"
319              colspan="2"
320            />
321            <tbl:columnheaders />
322          </tbl:headerrow>
323          <%
324          int numFilters = cc.getNumPropertyFilters();
325          int numRows = cc.getFilterRows();
326          for (int filterNo = 0; filterNo < numRows; filterNo++)
327          {
328            boolean lastRow = filterNo == numRows-1;
329            %>
330            <tbl:headerrow>
331              <tbl:header subclass="index" />
332              <tbl:header 
333                subclass="icons" 
334                visible="<%=mode.hasIcons()%>"
335                >
336                <base:icon
337                  subclass="link table-filter-row-action"
338                  image="add.png"
339                  tooltip="Add extra filter row"
340                  visible="<%=lastRow%>"
341                /><base:icon
342                  subclass="link table-filter-row-action"
343                  image="remove.png"
344                  tooltip="Remove this filter row"
345                  visible="<%=numRows > 1 || numFilters > 0 %>"
346                  data-remove-row="<%=filterNo%>"
347                />
348              </tbl:header>
349              <tbl:propertyfilter row="<%=filterNo%>" />
350            </tbl:headerrow>
351            <%
352          }
353          %>
354          <tbl:columnsubtitles />
355        </tbl:headers>
356        <tbl:rows>
357          <%
358          if (cc.getMessage() != null)
359          {
360            %>
361            <tbl:panel subclass="bg-filled-50">
362              <div class="messagecontainer error"><%=cc.getMessage()%></div>
363            </tbl:panel>
364            <%
365            cc.setMessage(null);
366          }
367          int index = cc.getPage()*cc.getRowsPerPage();
368          int selectedItemId = cc.getId();
369          if (spotData != null)
370          {
371            boolean writeReporterPermission = sc.hasPermission(Permission.WRITE, Item.REPORTER);
372            String tooltip = "View this item" + (writeReporterPermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
373            while (spotData.hasNext())
374            {
375              SqlResult item = spotData.next();
376              index++;
377              numListed++;
378              %>
379              <tbl:row>
380                <tbl:header 
381                  clazz="index"
382                  ><%=index%></tbl:header>
383                <tbl:header 
384                  clazz="icons" 
385                  visible="<%=mode.hasIcons()%>"
386                  >&nbsp;</tbl:header>
387                <%
388                int i = 1;
389                for (String columnId : selected.selectedIds)
390                {
391                  if (i == externalIdColumn)
392                  {
393                    %>
394                    <tbl:cell column="<%=columnId%>"><div 
395                      class="link auto-init"
396                      data-auto-init="item-link"
397                      data-item-id="<%=item.getInt(reporterIdColumn)%>"
398                      data-item-type="REPORTER"
399                      data-no-edit="<%=writeReporterPermission ? 0 : 1 %>" 
400                      tabindex="0"
401                      title="<%=tooltip%>"><%=HTML.encodeTags(item.getString(i++))%></div></tbl:cell>
402                    <%
403                  }
404                  else
405                  {
406                    %>
407                    <tbl:cell column="<%=columnId%>" value="<%=item.getObject(i++)%>" />
408                    <%
409                  }
410                }
411                %>
412              </tbl:row>
413              <%
414            }
415          }
416          if (numListed == 0)
417          {
418            %>
419            <tbl:panel subclass="bg-filled-50">
420              <div class="messagecontainer note">
421              <%=spotData == null || spotData.getTotalCount() == 0 ? "No spot data were found" : "No spot data on this page. Please select another page!" %>
422              </div>
423            </tbl:panel>
424            <%
425          }
426          %>
427          </tbl:rows>
428        </tbl:data>
429    </tbl:table>
430    </t:tab>
431
432    <t:tab id="bioassayset.overviewplots" title="Overview plots"
433      visible="<%=overviewPlotInvoker != null && overviewPlotInvoker.getNumExtensions() > 0%>" 
434    />
435    </t:tabcontrol>
436
437    <base:buttongroup>
438      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
439      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
440      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
441    </base:buttongroup>
442
443  </base:body>
444  </base:page>
445  <%
446}
447finally
448{
449  if (dc != null) dc.close();
450}
451%>
Note: See TracBrowser for help on using the repository browser.