source: branches/3.18-stable/www/admin/platforms/variants/list_variants.jsp @ 7932

Last change on this file since 7932 was 7932, checked in by Nicklas Nordborg, 6 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: 15.2 KB
Line 
1<%-- $Id:list_variants.jsp 3820 2007-10-12 10:03:18Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Nicklas Nordborg
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 pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.Platform"
32  import="net.sf.basedb.core.PlatformVariant"
33  import="net.sf.basedb.core.RawDataType"
34  import="net.sf.basedb.core.ItemQuery"
35  import="net.sf.basedb.core.ItemResultIterator"
36  import="net.sf.basedb.core.Permission"
37  import="net.sf.basedb.core.PluginDefinition"
38  import="net.sf.basedb.core.PermissionDeniedException"
39  import="net.sf.basedb.core.query.Restrictions"
40  import="net.sf.basedb.core.query.Expressions"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.core.plugin.GuiContext"
44  import="net.sf.basedb.core.plugin.Plugin"
45  import="net.sf.basedb.clients.web.Base"
46  import="net.sf.basedb.clients.web.PermissionUtil"
47  import="net.sf.basedb.clients.web.ModeInfo"
48  import="net.sf.basedb.clients.web.util.HTML"
49  import="net.sf.basedb.util.Values"
50  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
51  import="net.sf.basedb.clients.web.extensions.JspContext"
52  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
53  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
54  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
55  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
56  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
57  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
58  import="java.util.List"
59  import="java.util.Map"
60%>
61<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
62<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
63<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
64<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
65<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
66<%!
67  private static final Item itemType = Item.PLATFORMVARIANT;
68  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
69%>
70<%
71final int platformId = Values.getInt(request.getParameter("platform_id"));
72final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
73final String ID = sc.getId();
74final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
75
76final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
77final String callback = request.getParameter("callback");
78final String title = mode.generateTitle("platform variant", "platform variants");
79final DbControl dc = sc.newDbControl();
80ItemResultIterator<PlatformVariant> variants = null;
81try
82{
83  final Platform platform = platformId > 0 ? Platform.getById(dc, platformId) : null;
84  final boolean createPermission = platform == null ? false : platform.hasPermission(Permission.WRITE);
85  final boolean deletePermission = createPermission;
86  final boolean writePermission = createPermission;
87
88  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
89  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, platform);
90  try
91  {
92    final ItemQuery<PlatformVariant> query = Base.getConfiguredQuery(dc, cc, jspContext, true, platform == null ? PlatformVariant.getQuery() : platform.getVariants(), mode);
93    variants = query.iterate(dc);
94  }
95  catch (Throwable t)
96  {
97    cc.setMessage(t.getMessage());
98  }
99  int numListed = 0;
100  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
101  ExtensionsInvoker<ListColumnAction<PlatformVariant,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
102  %>
103  <base:page title="<%=title%>" type="<%=mode.getPageType()%>" id="list-page">
104  <base:head scripts="table.js,tabcontrol-2.js,~variants.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,help.css">
105    <ext:scripts context="<%=jspContext%>" />
106    <ext:stylesheets context="<%=jspContext%>" />
107  </base:head>
108 
109  <base:body>
110    <%
111    if (platform != null)
112    {
113      %>
114      <p:path><p:pathelement 
115        title="Platforms" href="<%="../index.jsp?ID="+ID%>" 
116        /><p:pathelement title="<%=HTML.encodeTags(platform.getName())%>" 
117        /></p:path>
118      <%
119    }
120    else
121    {
122      %>
123      <h1><%=title%></h1>
124      <%
125    }
126    %>
127
128    <t:tabcontrol 
129      id="main"
130      subclass="content mastertabcontrol"
131      active="variant" notabs="<%=platform == null %>">
132    <t:tab id="properties" title="Properties" visible="<%=platform != null %>"/>
133   
134    <t:tab id="variant" title="Variants">
135    <tbl:table 
136      id="variants" 
137      columns="<%=cc.getSetting("columns")%>"
138      sortby="<%=cc.getSortProperty()%>" 
139      direction="<%=cc.getSortDirection()%>"
140      action="index.jsp"
141      sc="<%=sc%>"
142      item="<%=itemType%>"
143      filterrows="<%=cc.getFilterRows()%>"
144      subclass="fulltable sticky-headers"
145      >
146      <tbl:hidden 
147        name="mode" 
148        value="<%=mode.getName()%>" 
149      />
150      <tbl:hidden 
151        name="platform_id" 
152        value="<%=String.valueOf(platformId)%>" 
153      />
154      <tbl:hidden 
155        name="callback" 
156        value="<%=callback%>" 
157        skip="<%=callback == null%>" 
158      />
159      <tbl:columndef 
160        id="platform" 
161        property="platform.name"
162        datatype="string"
163        title="Platform"
164        sortable="true" 
165        filterable="true"
166        exportable="true"
167        show="<%=platform==null ? "always" : "never" %>" 
168      />
169      <tbl:columndef 
170        id="name"
171        property="name"
172        datatype="string"
173        title="Name"
174        sortable="true" 
175        filterable="true"
176        exportable="true"
177        show="always" 
178      />
179      <tbl:columndef 
180        id="id"
181        clazz="uniquecol"
182        property="id"
183        datatype="int"
184        title="ID"
185        sortable="true"
186        filterable="true"
187        exportable="true"
188      />
189      <tbl:columndef 
190        id="externalId"
191        clazz="uniquecol"
192        property="externalId"
193        datatype="string"
194        title="External ID"
195        sortable="true"
196        filterable="true"
197        exportable="true"
198      />
199      <tbl:columndef 
200        id="fileOnly"
201        property="fileOnly"
202        datatype="boolean"
203        title="File-only"
204        sortable="true"
205        filterable="true"
206        exportable="true"
207      />
208      <tbl:columndef 
209        id="rawDataType"
210        property="rawDataType"
211        datatype="string"
212        title="Raw data type"
213        sortable="true"
214        filterable="true"
215        exportable="true"
216      />
217      <tbl:columndef 
218        id="channels"
219        property="channels"
220        datatype="int"
221        title="Channels"
222        sortable="true"
223        filterable="true"
224        exportable="true"
225      />
226      <tbl:columndef 
227        id="description"
228        property="description"
229        datatype="string"
230        title="Description" 
231        sortable="true" 
232        filterable="true" 
233        exportable="true"
234      />
235      <tbl:columndef 
236        id="xt-columns" 
237        extensions="<%=columnsInvoker%>" 
238        jspcontext="<%=jspContext%>" 
239      />
240      <div class="panelgroup bg-filled-50 bottomborder">
241        <tbl:toolbar
242          subclass="bottomborder"
243          visible="<%=mode.hasToolbar()%>"
244          >
245          <tbl:button 
246            id="btnNewItem"
247            data-extra-url="<%="&platform_id="+platformId%>"
248            disabled="<%=!createPermission%>" 
249            image="new.png" 
250            title="New&hellip;" 
251            tooltip="<%=createPermission ? "Create variant" : "You do not have permission to create variants"%>" 
252          />
253          <tbl:button 
254            id="btnDeleteItems"
255            disabled="<%=!deletePermission%>" 
256            image="delete.png" 
257            title="Delete" 
258            tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete variants" %>" 
259          />
260          <tbl:button 
261            id="btnRestoreItems"
262            disabled="<%=!writePermission%>" 
263            image="restore.png" 
264            title="Restore" 
265            tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to edit variants" %>" 
266          />
267          <tbl:button 
268            id="btnColumns"
269            image="columns.png" 
270            title="Columns&hellip;" 
271            tooltip="Show, hide and re-order columns" 
272          />
273          <tbl:button 
274            id="btnImport"
275            data-plugin-type="IMPORT"
276            image="import.png" 
277            title="Import&hellip;" 
278            tooltip="Import data" 
279            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
280          />
281          <tbl:button 
282            id="btnExport"
283            data-plugin-type="EXPORT"
284            image="export.png" 
285            title="Export&hellip;" 
286            tooltip="Export data" 
287            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
288          />
289          <tbl:button 
290            id="btnRunPlugin"
291            data-plugin-type="OTHER"
292            image="runplugin.png" 
293            title="Run plugin&hellip;" 
294            tooltip="Run a plugin" 
295            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
296          />
297          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
298            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
299        </tbl:toolbar>
300        <tbl:panel>
301          <tbl:presetselector />
302          <tbl:navigator
303            page="<%=cc.getPage()%>" 
304            rowsperpage="<%=cc.getRowsPerPage()%>" 
305            totalrows="<%=variants == null ? 0 : variants.getTotalCount()%>" 
306            visible="<%=mode.hasNavigator()%>"
307          />
308        </tbl:panel>
309      </div>
310      <tbl:data>
311        <tbl:headers>
312          <tbl:headerrow>
313            <tbl:header colspan="3" />
314            <tbl:columnheaders />
315          </tbl:headerrow>
316          <%
317          int numFilters = cc.getNumPropertyFilters();
318          int numRows = cc.getFilterRows();
319          for (int filterNo = 0; filterNo < numRows; filterNo++)
320          {
321            boolean lastRow = filterNo == numRows-1;
322            %>
323            <tbl:headerrow>
324              <tbl:header subclass="index" />
325              <tbl:header 
326                subclass="check" 
327                visible="<%=mode.hasCheck()%>"
328                ><base:icon 
329                  subclass="link table-check"
330                  image="check_uncheck.png" 
331                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
332                  visible="<%=lastRow%>"
333                /></tbl:header>
334              <tbl:header 
335                subclass="check" 
336                visible="<%=mode.hasRadio()%>"
337                />
338              <tbl:header 
339                subclass="icons" 
340                visible="<%=mode.hasIcons()%>"
341                >
342                <base:icon
343                  subclass="link table-filter-row-action"
344                  image="add.png"
345                  tooltip="Add extra filter row"
346                  visible="<%=lastRow%>"
347                /><base:icon
348                  subclass="link table-filter-row-action"
349                  image="remove.png"
350                  tooltip="Remove this filter row"
351                  visible="<%=numRows > 1 || numFilters > 0 %>"
352                  data-remove-row="<%=filterNo%>"
353                />
354              </tbl:header>
355              <tbl:propertyfilter row="<%=filterNo%>" />
356            </tbl:headerrow>
357            <%
358          }
359          %>
360          <tbl:columnsubtitles />
361        </tbl:headers>
362        <tbl:rows>
363          <%
364          if (cc.getMessage() != null)
365          {
366            %>
367            <tbl:panel subclass="bg-filled-50">
368              <div class="messagecontainer error"><%=cc.getMessage()%></div>
369            </tbl:panel>
370            <%
371            cc.setMessage(null);
372          }
373          int index = cc.getPage()*cc.getRowsPerPage();
374          int selectedItemId = cc.getId();
375          if (variants != null)
376          {           
377            while (variants.hasNext())
378            {
379              PlatformVariant item = variants.next();
380              RawDataType rdt = item.getRawDataType();
381              int itemId = item.getId();
382              String name = HTML.encodeTags(item.getName());
383              String tooltip = mode.isSelectionMode() ? 
384                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : ""); 
385             
386              index++;
387              numListed++;
388              %>
389              <tbl:row>
390                <tbl:header 
391                  clazz="index"
392                  ><%=index%></tbl:header>
393                <tbl:header 
394                  clazz="check" 
395                  visible="<%=mode.hasCheck()%>"
396                  ><input 
397                    type="checkbox" 
398                    name="<%=itemId%>" 
399                    value="<%=itemId%>" 
400                    title="<%=name%>" 
401                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
402                  ></tbl:header>
403                <tbl:header 
404                  clazz="check" 
405                  visible="<%=mode.hasRadio()%>"
406                  ><input 
407                    type="radio" 
408                    name="item_id" 
409                    value="<%=itemId%>" 
410                    title="<%=name%>" 
411                    <%=selectedItemId == itemId ? "checked" : ""%>
412                  ></tbl:header>
413                <tbl:header 
414                  clazz="icons" 
415                  visible="<%=mode.hasIcons()%>"
416                  ><base:icon 
417                    image="deleted.png"
418                    id="<%="delete."+itemId %>"
419                    subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
420                    data-item-id="<%=itemId%>"
421                    tooltip="This item has been scheduled for deletion" 
422                    visible="<%=item.isRemoved()%>"
423                  />&nbsp;</tbl:header>
424                <tbl:cell column="name"><div 
425                  class="link table-item"
426                  data-item-id="<%=itemId%>"
427                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
428                  data-extra-url="&platform_id=<%=platformId%>"
429                  tabindex="0"
430                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
431                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
432                <tbl:cell column="platform"><base:propertyvalue 
433                    item="<%=item%>" property="platform"
434                    enableEditLink="<%=mode.hasEditLink()%>" 
435                    enablePropertyLink="<%=mode.hasPropertyLink()%>"/></tbl:cell>
436                <tbl:cell column="externalId"><%=item.getExternalId()%></tbl:cell>
437                <tbl:cell column="fileOnly"><%=item.isFileOnly() ? "yes" : "no"%></tbl:cell>
438                <tbl:cell column="channels"><%=rdt == null ? "N/A" : rdt.getChannels()%></tbl:cell>
439                <tbl:cell column="rawDataType">
440                  <%=item.isFileOnly() ? "N/A" : (rdt == null ? "<i>- any -</i>" : rdt.getName())%>
441                </tbl:cell>
442                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
443                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
444                  <tbl:cell column="xt-columns" />
445                </tbl:xt-cells>
446              </tbl:row>
447              <%
448              }
449            }
450          if (numListed == 0)
451          {
452            %>
453            <tbl:panel subclass="bg-filled-50">
454              <div class="messagecontainer note">
455              <%=variants == null || variants.getTotalCount() == 0 ? "No variants were found" : "No variants on this page. Please select another page!" %>
456              </div>
457            </tbl:panel>
458            <%
459          }
460          %>
461        </tbl:rows>
462      </tbl:data>
463    </tbl:table>
464    <base:buttongroup subclass="dialogbuttons">
465      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
466      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
467      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
468    </base:buttongroup>
469    </t:tab>
470    </t:tabcontrol>
471
472  </base:body>
473  </base:page>
474  <%
475}
476finally
477{
478  if (variants != null) variants.close();
479  if (dc != null) dc.close();
480}
481%>
Note: See TracBrowser for help on using the repository browser.