source: trunk/www/biomaterials/bioplates/wells/list_biowells.jsp @ 5948

Last change on this file since 5948 was 5948, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

Started with the list pages. So far the reporters and the biosurce, sample and extract list pages have been done. The other pages have just been modified to not cause any compilation problems and to display almost ok.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 16.6 KB
Line 
1<%-- $Id: list_biowells.jsp 5948 2012-02-08 13:16:27Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
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 Martin
24  @version 2.10
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.Include"
31  import="net.sf.basedb.core.ItemContext"
32  import="net.sf.basedb.core.BioPlate"
33  import="net.sf.basedb.core.BioPlateType"
34  import="net.sf.basedb.core.BioWell"
35  import="net.sf.basedb.core.MeasuredBioMaterial"
36  import="net.sf.basedb.core.BioMaterialEvent"
37  import="net.sf.basedb.core.ItemQuery"
38  import="net.sf.basedb.core.ItemResultIterator"
39  import="net.sf.basedb.core.ItemResultList"
40  import="net.sf.basedb.core.Permission"
41  import="net.sf.basedb.core.PluginDefinition"
42  import="net.sf.basedb.core.PermissionDeniedException"
43  import="net.sf.basedb.core.query.Restrictions"
44  import="net.sf.basedb.core.query.Expressions"
45  import="net.sf.basedb.core.query.Orders"
46  import="net.sf.basedb.core.query.Hql"
47  import="net.sf.basedb.core.plugin.GuiContext"
48  import="net.sf.basedb.core.plugin.Plugin"
49  import="net.sf.basedb.core.data.ReporterData"
50  import="net.sf.basedb.util.Enumeration"
51  import="net.sf.basedb.clients.web.Base"
52  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
53  import="net.sf.basedb.clients.web.ModeInfo"
54  import="net.sf.basedb.clients.web.PermissionUtil"
55  import="net.sf.basedb.clients.web.util.HTML"
56  import="net.sf.basedb.util.Values"
57  import="net.sf.basedb.util.formatter.Formatter"
58  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
59  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
60  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
61  import="net.sf.basedb.clients.web.extensions.JspContext"
62  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
63  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
64  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
65  import="java.util.List"
66  import="java.util.Map"
67  import="java.util.Date"
68%>
69<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
70<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
71<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
72<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
73<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
74<%!
75  private static final Item itemType = Item.BIOWELL;
76  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
77%>
78<%
79final int bioPlateId = Values.getInt(request.getParameter("bioplate_id"));
80final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
81final String ID = sc.getId();
82final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
83
84final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
85final String callback = request.getParameter("callback");
86final String title = mode.generateTitle("biowell", "biowells");
87final DbControl dc = sc.newDbControl();
88ItemResultIterator<BioWell> biowells = null;
89
90Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
91Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
92
93WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
94WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
95
96try
97{
98  final BioPlate bioplate = BioPlate.getById(dc, bioPlateId);
99  final BioPlateType bioPlateType = bioplate.getBioPlateType();
100  final boolean createPermission = bioplate.hasPermission(Permission.WRITE);
101  final boolean deletePermission = createPermission;
102  final BioWell.LockMode lockMode = bioPlateType.getLockMode();
103
104  Enumeration<String, String> rows = new Enumeration<String,String>();
105  for (int r = 0; r < bioplate.getPlateGeometry().getRows(); r++)
106  {
107    rows.add(Integer.toString(r), rowFormatter.format(r));
108  }
109 
110  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
111 
112  try
113  {
114    final ItemQuery<BioWell> query = Base.getConfiguredQuery(dc, cc, true, bioplate.getBioWells(), mode);
115    query.join(Hql.leftJoin(null, "bioMaterial", "mbm", null, true));
116    query.join(Hql.leftJoin("mbm", "creationEvent", "evt", null, true));
117    if (!"row".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("row")));
118    if (!"column".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("column")));
119    biowells = query.iterate(dc);
120  }
121  catch (Throwable t)
122  {
123    cc.setMessage(t.getMessage());
124    t.printStackTrace();
125  }
126  int numListed = 0;
127  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioplate);
128  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
129  %>
130  <base:page title="<%=title%>" type="<%=mode.getPageType()%>">
131  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
132    <ext:scripts context="<%=jspContext%>" />
133    <ext:stylesheets context="<%=jspContext%>" />
134    <script language="JavaScript">
135    var submitPage = 'index.jsp';
136    var formId = 'biowells';
137
138    function editItem(itemId)
139    {
140      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
141    }
142    function itemOnClick(itemId)
143    {
144      Table.itemOnClick(formId, null, itemId, '<%=mode.getName()%>', null, null, returnSelected);
145    }
146    function configureColumns()
147    {
148      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
149    }
150    function runPlugin(cmd)
151    {
152      Table.submitToPopup(formId, cmd, 750, 500);
153    }
154    function returnSelected()
155    {
156      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
157      window.close();
158    }
159    function presetOnChange()
160    {
161      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
162    }
163    function switchTab(tabControlId, tabId)
164    {
165      if (tabId == 'properties' || tabId == 'annotations' || tabId == 'history')
166      {
167        location.href = '../index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=bioPlateId%>&tab='+tabId;
168      }
169      else if (tabId == 'events')
170      {
171        location.href = '../events/index.jsp?ID=<%=ID%>&bioplate_id=<%=bioPlateId%>';
172      }
173      else
174      {
175        TabControl.setActiveTab(tabControlId, tabId);
176      }
177    }
178    </script>
179  </base:head>
180 
181  <base:body>
182    <%
183    if (!mode.isSelectionMode())
184    {
185      %>
186      <p>
187      <p:path>
188        <p:pathelement title="Bioplates" href="<%="../index.jsp?ID="+ID%>" />
189        <p:pathelement title="<%=HTML.encodeTags(bioplate.getName())%>" />
190      </p:path>
191      <%
192    }
193    %>
194
195    <t:tabcontrol id="main" active="biowells" switch="switchTab">
196    <t:tab id="properties" title="Properties" />
197    <t:tab id="annotations" title="Annotations" />       
198    <t:tab id="biowells" title="Wells">
199   
200    <%
201    if (cc.getMessage() != null)
202    {
203      %>
204      <div class="error"><%=cc.getMessage()%></div>
205      <%
206      cc.setMessage(null);
207    }
208    %>
209    <tbl:table 
210      id="biowells" 
211       
212      columns="<%=cc.getSetting("columns")%>"
213      sortby="<%=cc.getSortProperty()%>" 
214      direction="<%=cc.getSortDirection()%>"
215      title="<%=title%>"
216      action="index.jsp"
217      sc="<%=sc%>"
218      item="<%=itemType%>"
219      >
220      <tbl:hidden 
221        name="mode" 
222        value="<%=mode.getName()%>" 
223      />
224      <tbl:hidden 
225        name="bioplate_id" 
226        value="<%=String.valueOf(bioPlateId)%>" 
227      />
228      <tbl:hidden 
229        name="callback" 
230        value="<%=callback%>" 
231        skip="<%=callback == null%>" 
232      />
233      <tbl:columndef 
234        id="row"
235        property="row"
236        datatype="int"
237        title="Row"
238        sortable="true" 
239        filterable="true"
240        enumeration="<%=rows%>"
241        exportable="true"
242        show="always" 
243        formatter="<%=rowFormatter%>"
244      />
245      <tbl:columndef 
246        id="column"
247        property="column"
248        datatype="int"
249        title="Column"
250        sortable="true" 
251        filterable="true"
252        exportable="true"
253        show="always" 
254        formatter="<%=columnFormatter%>"
255      />
256      <tbl:columndef 
257        id="id"
258        clazz="uniquecol"
259        property="id"
260        datatype="int"
261        title="ID"
262        sortable="true"
263        filterable="true"
264        exportable="true"
265      /> 
266      <tbl:columndef 
267        id="bioMaterial.name"
268        property="$mbm.name"
269        datatype="string"
270        title="[Biomtrl] Name"
271        sortable="true" 
272        filterable="true"
273        exportable="true"
274      />
275      <tbl:columndef 
276        id="bioMaterial.description"
277        property="$mbm.description"
278        datatype="string"
279        title="[Biomtrl] Description" 
280        sortable="true" 
281        filterable="true" 
282        exportable="true"
283      />
284      <tbl:columndef 
285        id="bioMaterial.entryDate"
286        property="$evt.entryDate"
287        datatype="date"
288        title="[Biomtrl] Registered"
289        sortable="true" 
290        filterable="true"
291        exportable="true"
292        formatter="<%=dateFormatter%>"
293      />
294      <tbl:columndef
295        id="bioMaterialList"
296        property="@bioMaterial.bioMaterialLists"
297        datatype="int"
298        title="[Biomtrl] Biomaterial list"
299        filterable="true"
300        enumeration="<%=Base.getBioMaterialListsEnum(dc, null, Include.ALL)%>"
301        multiple="false"
302      />
303      <tbl:columndef 
304        id="originalBioMaterial.name"
305        property="originalBioMaterial.name"
306        datatype="string"
307        title="[Biomtrl] Original"
308        sortable="true" 
309        filterable="true"
310        exportable="true"
311      />
312      <tbl:columndef
313        id="permission"
314        title="Permission"
315      />
316      <tbl:toolbar
317        visible="<%=mode.hasToolbar()%>"
318        >
319        <tbl:button 
320          image="columns.png" 
321          onclick="configureColumns()" 
322          title="Columns&hellip;" 
323          tooltip="Show, hide and re-order columns" 
324        />
325        <tbl:button 
326          image="import.png" 
327          onclick="runPlugin('ImportItems')" 
328          title="Import&hellip;" 
329          tooltip="Import data" 
330          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
331        />
332        <tbl:button 
333          image="export.png" 
334          onclick="runPlugin('ExportItems')" 
335          title="Export&hellip;" 
336          tooltip="Export data" 
337          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
338        />
339        <tbl:button 
340          image="runplugin.png" 
341          onclick="runPlugin('RunListPlugin')" 
342          title="Run plugin&hellip;" 
343          tooltip="Run a plugin" 
344          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
345        />
346        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
347          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
348      </tbl:toolbar>
349      <tbl:navigator
350        page="<%=cc.getPage()%>" 
351        rowsperpage="<%=cc.getRowsPerPage()%>" 
352        totalrows="<%=biowells == null ? 0 : biowells.getTotalCount()%>" 
353        visible="<%=mode.hasNavigator()%>"
354      />
355      <tbl:data>
356        <tbl:headers>
357          <tbl:headerrow>
358            <tbl:header colspan="3" />
359            <tbl:columnheaders />
360          </tbl:headerrow>
361          <tbl:headerrow>
362            <tbl:header subclass="index" />
363            <tbl:header 
364              subclass="check" 
365              visible="<%=mode.hasCheck()%>"
366              ><base:icon 
367                image="check_uncheck.png" 
368                tooltip="Check/uncheck all" 
369                onclick="Forms.checkUncheck(document.forms[formId])" 
370              /></tbl:header>
371            <tbl:header 
372              subclass="check" 
373              visible="<%=mode.hasRadio()%>"
374              />
375            <tbl:header 
376              subclass="icons" 
377              visible="<%=mode.hasIcons()%>"
378              />
379            <tbl:propertyfilter />
380          </tbl:headerrow>
381        </tbl:headers>
382        <tbl:rows>
383          <%
384          int index = cc.getPage()*cc.getRowsPerPage();
385          int selectedItemId = cc.getId();
386          if (biowells != null)
387          {           
388            while (biowells.hasNext())
389            {
390              BioWell item = biowells.next();
391              int itemId = item.getId();
392              String coordinate = rowFormatter.format(item.getRow()) + columnFormatter.format(item.getColumn());
393              index++;
394              numListed++;
395              MeasuredBioMaterial bioMaterial = null;
396              BioMaterialEvent creationEvent = null;
397              boolean editWellPermission = true;
398              try
399              {
400                bioMaterial = item.getBioMaterial();
401                if (bioMaterial != null)
402                {
403                  creationEvent = bioMaterial.getCreationEvent();
404                  editWellPermission = bioMaterial.hasPermission(Permission.WRITE) && !bioMaterial.isLockedInWell();
405                }
406                else
407                {
408                  editWellPermission = item.canAddBioMaterial();
409                }
410              }
411              catch (PermissionDeniedException ex)
412              {
413                editWellPermission = false;
414              }
415              %>
416              <tbl:row>
417                <tbl:header 
418                  clazz="index"
419                  ><%=index%></tbl:header>
420                <tbl:header 
421                  clazz="check" 
422                  visible="<%=mode.hasCheck()%>"
423                  ><input 
424                    type="checkbox" 
425                    name="<%=itemId%>" 
426                    value="<%=itemId%>" 
427                    title="<%=coordinate%>" 
428                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
429                  ></tbl:header>
430                <tbl:header 
431                  clazz="check" 
432                  visible="<%=mode.hasRadio()%>"
433                  ><input 
434                    type="radio" 
435                    name="item_id" 
436                    value="<%=itemId%>" 
437                    title="<%=coordinate%>" 
438                    <%=selectedItemId == itemId ? "checked" : ""%>
439                  ></tbl:header>
440                <tbl:header 
441                  clazz="icons" 
442                  visible="<%=mode.hasIcons()%>"
443                  >&nbsp;</tbl:header>
444               
445                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
446                <tbl:cell column="row">
447                  <%
448                  if (mode.isSelectionMode())
449                  {
450                    %>
451                    <div class="link" onclick="itemOnClick(<%=itemId%>)" title="Select this item">
452                      <tbl:cellvalue value="<%=item.getRow()%>" />
453                    </div>
454                  <%
455                  }
456                  else
457                  {
458                    %><tbl:cellvalue value="<%=item.getRow()%>" /><%
459                  }
460                  %>
461                </tbl:cell>
462                <tbl:cell column="column" value="<%=item.getColumn()%>" />
463                <tbl:cell column="bioMaterial.name">
464                  <base:propertyvalue 
465                      item="<%=item%>" 
466                      property="bioMaterial"
467                      enableEditLink="<%=mode.hasEditLink()%>" 
468                      enablePropertyLink="<%=mode.hasPropertyLink()%>"
469                  />
470                  <base:icon 
471                    visible="<%=editWellPermission%>"
472                    image="edit.png"
473                    tooltip="<%=bioMaterial == null ? "Add biomaterial to this well" : "Change the biomaterial in this well"%>"
474                    onclick="<%="editItem("+item.getId()+")"%>"
475                  />
476                  <base:icon 
477                    visible="<%=!editWellPermission%>"
478                    image="locked.png"
479                    tooltip="<%=item.hasBeenUsed() ? "This well has already been used" : "This well is locked for modification"%>"
480                  />
481                </tbl:cell>
482                <tbl:cell column="bioMaterial.description"><base:propertyvalue item="<%=item%>" property="bioMaterial.description"/></tbl:cell>
483                <tbl:cell column="bioMaterial.entryDate" value="<%=creationEvent == null ? null : creationEvent.getEntryDate() %>" />
484                <tbl:cell column="originalBioMaterial.name"><base:propertyvalue item="<%=item%>" property="originalBioMaterial" /></tbl:cell>
485                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
486              </tbl:row>
487              <%
488            }
489          }
490          %>
491          </tbl:rows>
492        </tbl:data>
493      <%
494      if (numListed == 0)
495      {
496        %>
497        <tbl:panel><%=biowells == null || biowells.getTotalCount() == 0 ? "No biowells were found" : "No biowells on this page. Please select another page!" %></tbl:panel>
498        <%
499      }
500      else
501      {
502        %>
503        <tbl:navigator
504          page="<%=cc.getPage()%>" 
505          rowsperpage="<%=cc.getRowsPerPage()%>" 
506          totalrows="<%=biowells == null ? 0 : biowells.getTotalCount()%>" 
507          visible="<%=mode.hasNavigator()%>"
508          locked="true"
509        />
510        <%
511      }
512      %>
513    </tbl:table>
514    <base:buttongroup clazz="fixedatbottom">
515      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
516      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
517      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
518    </base:buttongroup>
519 
520    </t:tab>
521    <t:tab id="events" title="Plate events" />
522    <t:tab id="history" title="Change history" 
523        tooltip="Displays a log of all modifications made to this item"
524        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
525    </t:tabcontrol>
526
527 
528  </base:body>
529  </base:page>
530  <%
531}
532finally
533{
534  if (biowells != null) biowells.close();
535  if (dc != null) dc.close();
536}
537%>
Note: See TracBrowser for help on using the repository browser.