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

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

References #2246: Sticky table headers

Implemented for all items in the "View" menu.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.6 KB
Line 
1<%-- $Id: list_reporters.jsp 7938 2021-05-03 11:20:19Z 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"
157      stickyheaders="cln.externalId"
158      >
159      <tbl:hidden 
160        name="mode" 
161        value="<%=mode.getName()%>" 
162      />
163      <tbl:hidden 
164        name="experiment_id" 
165        value="<%=String.valueOf(experimentId)%>" 
166      />
167      <tbl:hidden 
168        name="callback" 
169        value="<%=callback%>" 
170        skip="<%=callback == null%>" 
171      />
172      <%
173      for (TableColumn tc : columns)
174      {
175        %>
176        <tbl:columndef
177          id="<%=tc.getId()%>"
178          property="<%=tc.getProperty()%>"
179          tooltip="<%=tc.getDescription()%>"
180          datatype="<%=tc.getDatatype().getStringValue()%>"
181          title="<%=HTML.encodeTags(tc.getTitle())%>"
182          sortable="<%=tc.getSortable()%>"
183          filterable="<%=tc.getFilterable()%>"
184          exportable="<%=tc.getExportable()%>"
185          show="<%="cln.externalId".equals(tc.getId()) ? "always" : tc.getShow()%>"
186          formatter="<%=tc.getFormatter()%>"
187        />
188        <%
189      }
190      %>
191      <tbl:columndef
192        id="upToDate"
193        property="upToDate"
194        filterproperty="=rep('version')==mrep('version')"
195        exportproperty="=rep('version')==mrep('version')"
196        datatype="boolean"
197        title="Up to date"
198        filterable="true"
199        exportable="true"
200      />
201      <tbl:columndef 
202        id="reporterList"
203        property="£reporterList"
204        datatype="int"
205        title="Reporter list"
206        filterable="true"
207        enumeration="<%=Base.getReporterListsEnum(dc)%>"
208        multiple="false"
209      />
210      <div class="panelgroup bg-filled-50 bottomborder">
211        <tbl:toolbar
212          subclass="bottomborder"
213          visible="<%=mode.hasToolbar()%>"
214          >
215          <tbl:button 
216            id="btnColumns"
217            image="columns.png" 
218            title="Columns&hellip;" 
219            tooltip="Show, hide and re-order columns" 
220          />
221          <tbl:button
222            id="btnNewReporterList"
223            image="add.png"
224            title="New reporter list&hellip;"
225            tooltip="Create a new reporter list from matching spots"
226            visible="<%=sc.hasPermission(Permission.CREATE, Item.REPORTERLIST)%>"
227          />
228          <tbl:button
229            id="btnUpdateClonedReporters"
230            visible="<%=writePermission%>"
231            image="refresh.png"
232            title="Update cloned reporters&hellip;"
233            tooltip="Update all cloned reporter annotations with information from the master table"
234          />
235          <tbl:button
236            id="btnRemoveClonedReporters"
237            visible="<%=writePermission%>"
238            image="delete_permanently.png"
239            title="Remove cloned reporters&hellip;"
240            tooltip="Remove all cloned reporter annotations"
241          />
242          <tbl:button 
243            id="btnExport"
244            data-plugin-type="EXPORT"
245            image="export.png" 
246            title="Export&hellip;" 
247            tooltip="Export data" 
248            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
249          />
250        </tbl:toolbar>
251        <tbl:panel>
252          <tbl:presetselector />
253          <tbl:navigator
254            page="<%=cc.getPage()%>" 
255            rowsperpage="<%=cc.getRowsPerPage()%>" 
256            totalrows="<%=reporters == null ? 0 : reporters.getTotalCount()%>" 
257            visible="<%=mode.hasNavigator()%>"
258          />
259        </tbl:panel>
260      </div>
261      <tbl:data>
262        <tbl:headers>
263          <tbl:headerrow>
264            <tbl:header clazz="row-index bg-filled-100" />
265            <tbl:columnheaders />
266          </tbl:headerrow>
267          <%
268          int numFilters = cc.getNumPropertyFilters();
269          int numRows = cc.getFilterRows();
270          for (int filterNo = 0; filterNo < numRows; filterNo++)
271          {
272            boolean lastRow = filterNo == numRows-1;
273            %>
274            <tbl:headerrow>
275              <tbl:header subclass="row-index bg-filled-100">
276                <div class="index-<%=mode.getName()%>">
277                  <div class="index"></div>
278                  <div class="check">
279                    <base:icon 
280                      subclass="link table-check"
281                      image="check_uncheck.png" 
282                      tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
283                      visible="<%=lastRow && mode.hasCheck()%>"
284                    />
285                  </div>
286                  <div class="icons">
287                    <base:icon
288                      subclass="link table-filter-row-action"
289                      image="add.png"
290                      tooltip="Add extra filter row"
291                      visible="<%=lastRow%>"
292                    /><base:icon
293                      subclass="link table-filter-row-action"
294                      image="remove.png"
295                      tooltip="Remove this filter row"
296                      visible="<%=numRows > 1 || numFilters > 0 %>"
297                      data-remove-row="<%=filterNo%>"
298                    />
299                  </div>
300                </div>
301              </tbl:header>
302              <tbl:propertyfilter row="<%=filterNo%>" />
303            </tbl:headerrow>
304            <%
305          }
306          %>
307          <tbl:columnsubtitles />
308        </tbl:headers>
309        <tbl:rows>
310          <%
311          if (cc.getMessage() != null)
312          {
313            %>
314            <tbl:panel subclass="bg-filled-50">
315              <div class="messagecontainer error"><%=cc.getMessage()%></div>
316            </tbl:panel>
317            <%
318            cc.setMessage(null);
319          }
320          int index = cc.getPage()*cc.getRowsPerPage();
321          int selectedItemId = cc.getId();
322          if (reporters != null)
323          {
324            boolean writeReporterPermission = sc.hasPermission(Permission.WRITE, Item.REPORTER);
325            String tooltip = "View this item" + (writeReporterPermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
326            int firstColumnIndex = hasUpToDateColumn ? 3 : 2;
327            int externalIdColumn = selected.selectedIds.indexOf("cln.externalId") + firstColumnIndex;
328           
329            while (reporters.hasNext())
330            {
331              SqlResult item = reporters.next();
332              int itemId = item.getInt(1);
333              String name = HTML.encodeTags(item.getString(externalIdColumn));
334              index++;
335              numListed++;
336              %>
337              <tbl:row>
338                <tbl:header clazz="row-index bg-filled-100">
339                  <div class="index-<%=mode.getName()%>">
340                    <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
341                    <div class="check">
342                      <base:input
343                        type="checkbox" 
344                        name="<%=itemId%>" 
345                        value="<%=itemId%>" 
346                        title="<%=name%>" 
347                        checked="<%=cc.getSelected().contains(itemId)%>"
348                        visible="<%=mode.hasCheck()%>"
349                      />
350                    </div>
351                    <div class="icons"></div>
352                  </div>
353                </tbl:header>
354
355                <tbl:cell column="upToDate" visible="<%=hasUpToDateColumn %>">
356                  <%=item.getObject(2) %>
357                </tbl:cell>
358                <%
359                int colIndex = firstColumnIndex;
360                for (String columnId : selected.selectedIds)
361                {
362                  if (colIndex == externalIdColumn)
363                  {
364                    %>
365                    <tbl:cell column="cln.externalId"><div 
366                      class="link table-item"
367                      data-item-id="<%=itemId%>"
368                      data-no-edit="<%=writeReporterPermission ? 0 : 1 %>" 
369                      tabindex="0"
370                      title="<%=tooltip%>"><%=HTML.encodeTags(name)%></div></tbl:cell>
371                    <%
372                  }
373                  else
374                  {
375                    %>
376                    <tbl:cell column="<%=columnId%>" value="<%=item.getObject(colIndex)%>" />
377                    <%
378                  }
379                  ++colIndex;
380                }
381                %>
382              </tbl:row>
383              <%
384            }
385          }
386          if (numListed == 0)
387          {
388            %>
389            <tbl:panel subclass="bg-filled-50">
390              <div class="messagecontainer note">
391              <%=reporters == null || reporters.getTotalCount() == 0 ? "No reporters were found" : "No reporters on this page. Please select another page!" %>
392              </div>
393            </tbl:panel>
394            <%
395          }
396          %>
397          </tbl:rows>
398        </tbl:data>
399    </tbl:table>
400    </t:tab>
401
402    <t:tab id="overview" title="Overview" 
403      tooltip="Display a tree overview of related items" />
404    <t:tab id="history" title="History"
405      tooltip="Displays a log with the history of this item"
406      visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
407    </t:tabcontrol>
408
409    <base:buttongroup>
410      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
411      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
412      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
413    </base:buttongroup>
414
415  </base:body>
416  </base:page>
417  <%
418}
419finally
420{
421  if (dc != null) dc.close();
422}
423%>
Note: See TracBrowser for help on using the repository browser.