source: branches/3.18-stable/www/views/experiments/reporters/list_reporters.jsp @ 7932

Last change on this file since 7932 was 7932, checked in by Nicklas Nordborg, 3 months ago

References #2246: Sticky table headers

Implemented for all item list pages and a few other places:

  • Extensions installation dialog
  • Administrate / Services list page
  • Batch inherit annotations
  • Manage list presets
  • List of changed item in view job dialog


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.5 KB
Line 
1<%-- $Id: list_reporters.jsp 7932 2021-04-28 07:16:56Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2011 Nicklas Nordborg
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 3
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 BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22--%>
23<%@ page pageEncoding="UTF-8" session="false"
24  import="net.sf.basedb.core.SessionControl"
25  import="net.sf.basedb.core.DbControl"
26  import="net.sf.basedb.core.Item"
27  import="net.sf.basedb.core.Type"
28  import="net.sf.basedb.core.ItemContext"
29  import="net.sf.basedb.core.Permission"
30  import="net.sf.basedb.core.Experiment"
31  import="net.sf.basedb.core.VirtualDb"
32  import="net.sf.basedb.core.BaseException"
33  import="net.sf.basedb.core.Reporter"
34  import="net.sf.basedb.core.DynamicResultIterator"
35  import="net.sf.basedb.core.PluginDefinition"
36  import="net.sf.basedb.core.Formula"
37  import="net.sf.basedb.core.IntensityTransform"
38  import="net.sf.basedb.core.plugin.GuiContext"
39  import="net.sf.basedb.core.plugin.Plugin"
40  import="net.sf.basedb.core.query.Expressions"
41  import="net.sf.basedb.core.query.Restrictions"
42  import="net.sf.basedb.core.query.Selects"
43  import="net.sf.basedb.core.query.Dynamic"
44  import="net.sf.basedb.core.query.SqlQuery"
45  import="net.sf.basedb.core.query.SqlResult"
46  import="net.sf.basedb.util.Enumeration"
47  import="net.sf.basedb.util.ColorGenerator"
48  import="net.sf.basedb.util.formatter.LookupFormatter"
49  import="net.sf.basedb.clients.web.Base"
50  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
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="java.util.Map"
58  import="java.util.HashMap"
59  import="java.util.List"
60  import="java.util.LinkedList"
61  import="java.util.ArrayList"
62  import="java.util.Set"
63  import="java.util.HashSet"
64  import="java.util.Arrays"
65%>
66<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
67<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
68<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
69<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
70<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
71<%!
72  private static final Item itemType = Item.REPORTER;
73  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
74%>
75<%
76final int experimentId = Values.getInt(request.getParameter("experiment_id"));
77final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
78final String ID = sc.getId();
79
80final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
81final String callback = request.getParameter("callback");
82final String title = mode.generateTitle("spot data", "spot data");
83final DbControl dc = sc.newDbControl();
84DynamicResultIterator reporters = null;
85try
86{
87  final Experiment experiment = Experiment.getById(dc, experimentId);
88  final String subContext = "clonedreporters." + experimentId;
89  final boolean writePermission = experiment.hasPermission(Permission.WRITE);
90  VirtualDb virtualDb = experiment.getVirtualDb();
91  if (!virtualDb.hasClonedReporters()) 
92  {
93    response.sendRedirect("../index.jsp?ID="+ID + "&cmd=ViewItem&item_id="+experimentId);
94    return;
95  }
96
97  final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
98  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
99 
100  List<TableColumn> columns = new LinkedList<TableColumn>();
101  DynamicUtil.addReporterColumns(columns, dc, experiment.getVirtualDb().getReporterCloneTemplate(), "cln.", "@", "[Cln] ");
102  DynamicUtil.addReporterColumns(columns, dc, "mst.", "@@", "[Mst] ");
103  DynamicUtil.SelectedInfo selected = DynamicUtil.getSelectedColumns(cc, columns, false);
104  final boolean hasUpToDateColumn = true;
105  try
106  {
107    final SqlQuery query = Reporter.getDynamicQuery(experiment);
108    query.select(Selects.expression(Dynamic.reporter("id"), "id", true));
109    if (hasUpToDateColumn)
110    {
111      query.select(
112        Selects.expression(
113          Expressions.bool(Restrictions.eq(Dynamic.reporter("version", true), Dynamic.reporter("version", false))),
114          "upToDate"
115        ));
116    }
117    cc.configureQuery(dc, query, selected.selectedProperties);
118    query.setFailSafe(true);
119    reporters = query.iterate(dc);
120  }
121  catch (Throwable t)
122  {
123    cc.setMessage(t.getMessage());
124    t.printStackTrace();
125  }
126  int numListed = 0;
127  %>
128  <base:page title="<%=title%>">
129  <base:head scripts="table.js,tabcontrol-2.js,~reporters.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css" />
130  <base:body>
131    <p:path><p:pathelement
132      title="Experiments" href="<%="../index.jsp?ID="+ID%>" 
133      /><p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
134      /></p:path>
135
136    <t:tabcontrol 
137      id="main" 
138      subclass="mastertabcontrol content"
139      active="clonedreporters">
140    <t:tab id="properties" title="Properties" />
141    <t:tab id="annotations" title="Annotations" 
142      tooltip="View annotation values" />
143    <t:tab id="bioassaysets" title="Bioassay sets" />
144
145    <t:tab id="clonedreporters" title="Cloned reporters" >
146    <tbl:table 
147      id="reporters" 
148      columns="<%=cc.getSetting("columns")%>"
149      sortby="<%=cc.getSortProperty()%>" 
150      direction="<%=cc.getSortDirection()%>"
151      action="index.jsp"
152      sc="<%=sc%>"
153      item="<%=itemType%>"
154      subcontext="<%=subContext%>"
155      filterrows="<%=cc.getFilterRows()%>"
156      subclass="fulltable sticky-headers"
157      >
158      <tbl:hidden 
159        name="mode" 
160        value="<%=mode.getName()%>" 
161      />
162      <tbl:hidden 
163        name="experiment_id" 
164        value="<%=String.valueOf(experimentId)%>" 
165      />
166      <tbl:hidden 
167        name="callback" 
168        value="<%=callback%>" 
169        skip="<%=callback == null%>" 
170      />
171      <%
172      for (TableColumn tc : columns)
173      {
174        %>
175        <tbl:columndef
176          id="<%=tc.getId()%>"
177          property="<%=tc.getProperty()%>"
178          tooltip="<%=tc.getDescription()%>"
179          datatype="<%=tc.getDatatype().getStringValue()%>"
180          title="<%=HTML.encodeTags(tc.getTitle())%>"
181          sortable="<%=tc.getSortable()%>"
182          filterable="<%=tc.getFilterable()%>"
183          exportable="<%=tc.getExportable()%>"
184          show="<%="cln.externalId".equals(tc.getId()) ? "always" : tc.getShow()%>"
185          formatter="<%=tc.getFormatter()%>"
186        />
187        <%
188      }
189      %>
190      <tbl:columndef
191        id="upToDate"
192        property="upToDate"
193        filterproperty="=rep('version')==mrep('version')"
194        exportproperty="=rep('version')==mrep('version')"
195        datatype="boolean"
196        title="Up to date"
197        filterable="true"
198        exportable="true"
199      />
200      <tbl:columndef 
201        id="reporterList"
202        property="£reporterList"
203        datatype="int"
204        title="Reporter list"
205        filterable="true"
206        enumeration="<%=Base.getReporterListsEnum(dc)%>"
207        multiple="false"
208      />
209      <div class="panelgroup bg-filled-50 bottomborder">
210        <tbl:toolbar
211          subclass="bottomborder"
212          visible="<%=mode.hasToolbar()%>"
213          >
214          <tbl:button 
215            id="btnColumns"
216            image="columns.png" 
217            title="Columns&hellip;" 
218            tooltip="Show, hide and re-order columns" 
219          />
220          <tbl:button
221            id="btnNewReporterList"
222            image="add.png"
223            title="New reporter list&hellip;"
224            tooltip="Create a new reporter list from matching spots"
225            visible="<%=sc.hasPermission(Permission.CREATE, Item.REPORTERLIST)%>"
226          />
227          <tbl:button
228            id="btnUpdateClonedReporters"
229            visible="<%=writePermission%>"
230            image="refresh.png"
231            title="Update cloned reporters&hellip;"
232            tooltip="Update all cloned reporter annotations with information from the master table"
233          />
234          <tbl:button
235            id="btnRemoveClonedReporters"
236            visible="<%=writePermission%>"
237            image="delete_permanently.png"
238            title="Remove cloned reporters&hellip;"
239            tooltip="Remove all cloned reporter annotations"
240          />
241          <tbl:button 
242            id="btnExport"
243            data-plugin-type="EXPORT"
244            image="export.png" 
245            title="Export&hellip;" 
246            tooltip="Export data" 
247            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
248          />
249        </tbl:toolbar>
250        <tbl:panel>
251          <tbl:presetselector />
252          <tbl:navigator
253            page="<%=cc.getPage()%>" 
254            rowsperpage="<%=cc.getRowsPerPage()%>" 
255            totalrows="<%=reporters == null ? 0 : reporters.getTotalCount()%>" 
256            visible="<%=mode.hasNavigator()%>"
257          />
258        </tbl:panel>
259      </div>
260      <tbl:data>
261        <tbl:headers>
262          <tbl:headerrow>
263            <tbl:header colspan="3" />
264            <tbl:columnheaders />
265          </tbl:headerrow>
266          <%
267          int numFilters = cc.getNumPropertyFilters();
268          int numRows = cc.getFilterRows();
269          for (int filterNo = 0; filterNo < numRows; filterNo++)
270          {
271            boolean lastRow = filterNo == numRows-1;
272            %>
273            <tbl:headerrow>
274              <tbl:header subclass="index" />
275              <tbl:header 
276                subclass="check" 
277                visible="<%=mode.hasCheck()%>"
278                ><base:icon 
279                  subclass="link table-check"
280                  image="check_uncheck.png" 
281                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
282                  visible="<%=lastRow%>"
283                /></tbl:header>
284              <tbl:header 
285                subclass="check" 
286                visible="<%=mode.hasRadio()%>"
287                />
288              <tbl:header 
289                subclass="icons" 
290                visible="<%=mode.hasIcons()%>"
291                >
292                <base:icon
293                  subclass="link table-filter-row-action"
294                  image="add.png"
295                  tooltip="Add extra filter row"
296                  visible="<%=lastRow%>"
297                /><base:icon
298                  subclass="link table-filter-row-action"
299                  image="remove.png"
300                  tooltip="Remove this filter row"
301                  visible="<%=numRows > 1 || numFilters > 0 %>"
302                  data-remove-row="<%=filterNo%>"
303                />
304              </tbl:header>
305              <tbl:propertyfilter row="<%=filterNo%>" />
306            </tbl:headerrow>
307            <%
308          }
309          %>
310          <tbl:columnsubtitles />
311        </tbl:headers>
312        <tbl:rows>
313          <%
314          if (cc.getMessage() != null)
315          {
316            %>
317            <tbl:panel subclass="bg-filled-50">
318              <div class="messagecontainer error"><%=cc.getMessage()%></div>
319            </tbl:panel>
320            <%
321            cc.setMessage(null);
322          }
323          int index = cc.getPage()*cc.getRowsPerPage();
324          int selectedItemId = cc.getId();
325          if (reporters != null)
326          {
327            boolean writeReporterPermission = sc.hasPermission(Permission.WRITE, Item.REPORTER);
328            String tooltip = "View this item" + (writeReporterPermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
329            int firstColumnIndex = hasUpToDateColumn ? 3 : 2;
330            int externalIdColumn = selected.selectedIds.indexOf("cln.externalId") + firstColumnIndex;
331           
332            while (reporters.hasNext())
333            {
334              SqlResult item = reporters.next();
335              int itemId = item.getInt(1);
336              String name = HTML.encodeTags(item.getString(externalIdColumn));
337              index++;
338              numListed++;
339              %>
340              <tbl:row>
341                <tbl:header 
342                  clazz="index"
343                  ><%=index%></tbl:header>
344                <tbl:header 
345                  clazz="check" 
346                  visible="<%=mode.hasCheck()%>"
347                  ><input 
348                    type="checkbox" 
349                    name="<%=itemId%>" 
350                    value="<%=itemId%>" 
351                    title="<%=name%>" 
352                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
353                  ></tbl:header>
354                <tbl:header clazz="icons" visible="<%=mode.hasIcons()%>" />
355
356                <tbl:cell column="upToDate" visible="<%=hasUpToDateColumn %>">
357                  <%=item.getObject(2) %>
358                </tbl:cell>
359                <%
360                int colIndex = firstColumnIndex;
361                for (String columnId : selected.selectedIds)
362                {
363                  if (colIndex == externalIdColumn)
364                  {
365                    %>
366                    <tbl:cell column="cln.externalId"><div 
367                      class="link table-item"
368                      data-item-id="<%=itemId%>"
369                      data-no-edit="<%=writeReporterPermission ? 0 : 1 %>" 
370                      tabindex="0"
371                      title="<%=tooltip%>"><%=HTML.encodeTags(name)%></div></tbl:cell>
372                    <%
373                  }
374                  else
375                  {
376                    %>
377                    <tbl:cell column="<%=columnId%>" value="<%=item.getObject(colIndex)%>" />
378                    <%
379                  }
380                  ++colIndex;
381                }
382                %>
383              </tbl:row>
384              <%
385            }
386          }
387          if (numListed == 0)
388          {
389            %>
390            <tbl:panel subclass="bg-filled-50">
391              <div class="messagecontainer note">
392              <%=reporters == null || reporters.getTotalCount() == 0 ? "No reporters were found" : "No reporters on this page. Please select another page!" %>
393              </div>
394            </tbl:panel>
395            <%
396          }
397          %>
398          </tbl:rows>
399        </tbl:data>
400    </tbl:table>
401    </t:tab>
402
403    <t:tab id="overview" title="Overview" 
404      tooltip="Display a tree overview of related items" />
405    <t:tab id="history" title="History"
406      tooltip="Displays a log with the history of this item"
407      visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
408    </t:tabcontrol>
409
410    <base:buttongroup>
411      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
412      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
413      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
414    </base:buttongroup>
415
416  </base:body>
417  </base:page>
418  <%
419}
420finally
421{
422  if (dc != null) dc.close();
423}
424%>
Note: See TracBrowser for help on using the repository browser.