source: branches/3.18-stable/www/views/experiments/explorer/search/list.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: 10.3 KB
Line 
1<%-- $Id: list.jsp 7938 2021-05-03 11:20:19Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Johan Enell, 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.ModeInfo"%>
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.ItemContext"
32  import="net.sf.basedb.core.Permission"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.Experiment"
35  import="net.sf.basedb.core.RawDataType"
36  import="net.sf.basedb.core.ExtendedProperties"
37  import="net.sf.basedb.core.ExtendedProperty"
38  import="net.sf.basedb.core.DynamicReporterQuery"
39  import="net.sf.basedb.core.DynamicResultIterator"
40  import="net.sf.basedb.core.VirtualColumn"
41  import="net.sf.basedb.core.data.ReporterData"
42  import="net.sf.basedb.core.query.Restrictions"
43  import="net.sf.basedb.core.query.Expressions"
44  import="net.sf.basedb.core.query.Dynamic"
45  import="net.sf.basedb.core.query.Orders"
46  import="net.sf.basedb.core.query.Selects"
47  import="net.sf.basedb.core.query.Aggregations"
48  import="net.sf.basedb.core.query.JoinType"
49  import="net.sf.basedb.core.query.SqlResult"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.DynamicUtil"
52  import="net.sf.basedb.clients.web.ExperimentExplorer"
53  import="net.sf.basedb.clients.web.WebException"
54  import="net.sf.basedb.util.Values"
55  import="net.sf.basedb.clients.web.util.HTML"
56  import="net.sf.basedb.clients.web.taglib.table.TableColumn"
57  import="java.util.Date"
58  import="java.util.Map"
59  import="java.util.HashMap"
60  import="java.util.List"
61  import="java.util.LinkedList"
62%>
63<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
64<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
65<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
66<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
67<%!
68  private static final Item itemType = Item.REPORTER;
69%>
70
71<%
72final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
73final String ID = sc.getId();
74final float scale = Base.getScale(sc);
75final String root = request.getContextPath();
76final ModeInfo mode = ModeInfo.DEFAULT;
77
78final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));
79final DbControl dc = sc.newDbControl();
80DynamicResultIterator reporters = null;
81long totalReporters = 0;
82try
83{
84  String title = null;
85  final BioAssaySet bioAssaySet = BioAssaySet.getById(dc, bioAssaySetId);
86  final Experiment experiment = bioAssaySet.getExperiment();
87  final RawDataType rawDataType = experiment.getRawDataType();
88 
89  final ExperimentExplorer explorer = ExperimentExplorer.getExplorer(bioAssaySet);
90  final ItemContext cc = explorer.getAndSetReporterContext(sc, null);
91  final String subContext = cc.getSubContext();
92
93  List<TableColumn> allColumns = new LinkedList<TableColumn>();
94  DynamicUtil.addReporterColumns(allColumns, dc, experiment.getVirtualDb().getReporterCloneTemplate(), "", "@", "");
95 
96  DynamicUtil.SelectedInfo selected = DynamicUtil.getSelectedColumns(cc, allColumns, false);
97  List<TableColumn> selectedColumns = selected.selectedColumns;
98 
99  try
100  {
101    DynamicReporterQuery reporterQuery = explorer.getReporterQuery(dc, selected.selectedProperties);
102    reporterQuery.setFailSafe(true);
103    totalReporters = explorer.getMatchingReporters(dc);
104    reporters = reporterQuery.iterate(dc);
105  }
106  catch (Throwable t)
107  {
108    cc.setMessage(t.getMessage());
109    t.printStackTrace();
110  }
111  int numListed = 0;
112  %>
113  <base:page title="<%=title%>">
114  <base:head scripts="table.js,tabcontrol-2.js,~list.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
115  <style>
116    .row-index > div
117    {
118      grid-template-columns: 1fr !important;
119    }
120    .row-index .index
121    {
122      padding-right: 3px;
123    }
124  </style
125  </base:head>
126  <base:body>
127    <p:path><p:pathelement
128      title="Experiments" href="<%="../../index.jsp?ID="+ID%>" 
129      /><p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
130        href="<%="../../bioassaysets/index.jsp?ID="+ID+"&amp;experiment_id="+experiment.getId()%>" 
131      /><p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" 
132        href="<%="../../bioassaysets/index.jsp?ID="+ID+"&amp;cmd=ViewItem&amp;item_id="+bioAssaySetId%>" 
133      /><p:pathelement title="Explorer" /></p:path>
134    <t:tabcontrol 
135      id="explorer"
136      subclass="mastertabcontrol content"
137      remember="false" active="search">
138    <t:tab id="search" title="Reporter search">
139    <tbl:table 
140      id="reporters" 
141      columns="<%=cc.getSetting("columns")%>"
142      sortby="<%=cc.getSortProperty()%>" 
143      direction="<%=cc.getSortDirection()%>"
144      action="index.jsp"
145      sc="<%=sc%>"
146      item="<%=itemType%>"
147      subcontext="<%=subContext%>"
148      filterrows="<%=cc.getFilterRows()%>"
149      subclass="fulltable"
150      stickyheaders="externalId"
151      >
152      <tbl:hidden 
153        name="bioassayset_id" 
154        value="<%=String.valueOf(bioAssaySetId)%>" 
155      />
156      <%
157      for (TableColumn tc : allColumns)
158      {
159        %>
160        <tbl:columndef
161          id="<%=tc.getId()%>"
162          clazz="<%="externalId".equals(tc.getId()) ? "uniquecol" : "columnheader"%>"
163          property="<%=tc.getProperty()%>"
164          datatype="<%=tc.getDatatype().getStringValue()%>"
165          title="<%=tc.getTitle()%>"
166          sortable="<%=tc.getSortable()%>"
167          filterable="<%=tc.getFilterable()%>"
168          exportable="<%=tc.getExportable()%>"
169          show="<%=tc.getShow()%>"
170          formatter="<%=tc.getFormatter()%>"
171        />
172        <%
173      }
174      %>
175      <tbl:columndef 
176        id="reporterList"
177        property="£reporterList"
178        datatype="int"
179        title="Reporter list"
180        filterable="true"
181        enumeration="<%=Base.getReporterListsEnum(dc)%>"
182        multiple="false"
183      />     
184     
185      <div class="panelgroup bg-filled-50 bottomborder">
186        <tbl:toolbar subclass="bottomborder">
187          <tbl:button 
188            id="btnColumns"
189            image="columns.png" 
190            title="Columns&hellip;" 
191            tooltip="Show, hide and re-order columns" 
192          />
193          <tbl:button
194            id="btnNewReporterList"
195            image="add.png"
196            title="New reporter list&hellip;"
197            tooltip="Create a new reporter list from matching reporters"
198            visible="<%=sc.hasPermission(Permission.CREATE, Item.REPORTERLIST)%>"
199          />
200        </tbl:toolbar>
201        <tbl:panel>
202          <tbl:presetselector />
203          <tbl:navigator
204            page="<%=cc.getPage()%>" 
205            rowsperpage="<%=cc.getRowsPerPage()%>" 
206            totalrows="<%=totalReporters%>" 
207          />
208        </tbl:panel>
209      </div>
210      <tbl:data>
211        <tbl:headers>
212          <tbl:headerrow>
213            <tbl:header clazz="row-index bg-filled-100" />
214            <tbl:columnheaders />
215          </tbl:headerrow>
216          <%
217          int numFilters = cc.getNumPropertyFilters();
218          int numRows = cc.getFilterRows();
219          for (int filterNo = 0; filterNo < numRows; filterNo++)
220          {
221            boolean lastRow = filterNo == numRows-1;
222            %>
223            <tbl:headerrow>
224              <tbl:header subclass="row-index bg-filled-100">
225                <div class="index-<%=mode.getName()%>">
226                  <div class="icons">
227                    <base:icon
228                      subclass="link table-filter-row-action"
229                      image="add.png"
230                      tooltip="Add extra filter row"
231                      visible="<%=lastRow%>"
232                    /><base:icon
233                      subclass="link table-filter-row-action"
234                      image="remove.png"
235                      tooltip="Remove this filter row"
236                      visible="<%=numRows > 1 || numFilters > 0 %>"
237                      data-remove-row="<%=filterNo%>"
238                    />
239                  </div>
240                </div>
241              </tbl:header>
242
243              <tbl:propertyfilter row="<%=filterNo%>" />
244            </tbl:headerrow>
245            <%
246          }
247          %>
248        </tbl:headers>
249        <tbl:rows>
250      <%
251      if (cc.getMessage() != null)
252      {
253        %>
254        <tbl:panel subclass="bg-filled-50">
255          <div class="messagecontainer error"><%=cc.getMessage()%></div>
256        </tbl:panel>
257        <%
258        cc.setMessage(null);
259      }
260      int rowIndex = cc.getPage()*cc.getRowsPerPage();
261      if (reporters != null)
262      {
263        boolean writeReporterPermission = sc.hasPermission(Permission.WRITE, Item.REPORTER);
264        String tooltip = "View this item" + (writeReporterPermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
265        while (reporters.hasNext())
266        {
267          SqlResult item = reporters.next();
268          int itemId = item.getInt(1);
269          rowIndex++;
270          numListed++;
271          %>
272          <tbl:row>
273            <tbl:header clazz="row-index bg-filled-100">
274              <div class="index-<%=mode.getName()%>">
275                <div class="index <%=rowIndex>999?"index-smaller":""%>"><span class="link auto-init" 
276                data-auto-init="view-reporter"
277                data-index="<%=rowIndex-1%>"><%=rowIndex%></span></div>
278              </div>
279            </tbl:header>
280            <%
281            int colIndex = 2;
282            for (TableColumn tc : selectedColumns)
283            {
284              String name = tc.getId();
285              if ("externalId".equals(name))
286              {
287                %>
288                <tbl:cell column="externalId"><div 
289                  class="link table-item"
290                  data-item-id="<%=itemId%>"
291                  data-no-edit="<%=writeReporterPermission ? 0 : 1%>"
292                  tabindex="0"
293                  title="<%=tooltip%>"><%=HTML.encodeTags(item.getString(colIndex))%></div></tbl:cell>
294                <%
295              }
296              else
297              {
298                %>
299                <tbl:cell column="<%=name%>"><tbl:cellvalue value="<%=item.getObject(colIndex)%>" /></tbl:cell>
300                <%
301              }
302              colIndex++;
303            }
304            %>
305          </tbl:row>
306          <%
307        }
308      }
309      if (numListed == 0)
310      {
311        %>
312        <tbl:panel subclass="bg-filled-50">
313          <div class="messagecontainer note">
314          <%=totalReporters == 0 ? "No reporters were found" : "No reporters on this page. Please select another page!" %>
315          </div>
316        </tbl:panel>
317        <%
318      }
319      %>
320      </tbl:rows>
321      </tbl:data>
322      </tbl:table>
323    </t:tab>
324
325    <t:tab id="view" title="Reporter view" />
326    </t:tabcontrol>
327
328  </base:body>
329  </base:page>
330  <%
331}
332finally
333{
334  if (reporters != null) reporters.close();
335  if (dc != null) dc.close();
336}
337
338%>
Note: See TracBrowser for help on using the repository browser.