source: trunk/www/lims/arraydesigns/features/list_features.jsp @ 6702

Last change on this file since 6702 was 6702, checked in by Nicklas Nordborg, 7 years ago

References #1912: Add more filter rows in list pages

Implemented on the array lims list pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 25.2 KB
Line 
1<%-- $Id: list_features.jsp 6702 2015-02-02 08:13:27Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Johan Enell, 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.data.FeatureData"
32  import="net.sf.basedb.core.data.ReporterData"
33  import="net.sf.basedb.core.ArrayDesign"
34  import="net.sf.basedb.core.ArrayDesignBlock"
35  import="net.sf.basedb.core.Feature"
36  import="net.sf.basedb.core.FeatureIdentificationMethod"
37  import="net.sf.basedb.core.ReporterType"
38  import="net.sf.basedb.core.Reporter"
39  import="net.sf.basedb.core.Well"
40  import="net.sf.basedb.core.ItemQuery"
41  import="net.sf.basedb.core.ItemResultIterator"
42  import="net.sf.basedb.core.DataQuery"
43  import="net.sf.basedb.core.DataResultIterator"
44  import="net.sf.basedb.core.ItemResultList"
45  import="net.sf.basedb.core.Permission"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.PermissionDeniedException"
48  import="net.sf.basedb.core.PlateGeometry"
49  import="net.sf.basedb.core.ExtendedProperty"
50  import="net.sf.basedb.core.ExtendedProperties"
51  import="net.sf.basedb.core.query.Aggregations" 
52  import="net.sf.basedb.core.query.Restrictions"
53  import="net.sf.basedb.core.query.Expressions"
54  import="net.sf.basedb.core.query.Orders"
55  import="net.sf.basedb.core.query.Hql"
56  import="net.sf.basedb.core.query.Selects"
57  import="net.sf.basedb.core.plugin.GuiContext"
58  import="net.sf.basedb.core.plugin.Plugin"
59  import="net.sf.basedb.util.Enumeration"
60  import="net.sf.basedb.clients.web.Base"
61  import="net.sf.basedb.clients.web.ModeInfo"
62  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
63  import="net.sf.basedb.clients.web.util.HTML"
64  import="net.sf.basedb.util.Values"
65  import="net.sf.basedb.util.formatter.Formatter"
66  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
67  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
68  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
69  import="net.sf.basedb.clients.web.extensions.JspContext"
70  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
71  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
72  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
73  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
74  import="java.util.List"
75  import="java.util.Map"
76  import="java.util.Date"
77%>
78<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
79<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
80<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
81<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
82<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
83<%!
84  private static final Item itemType = Item.FEATURE;
85  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
86%>
87<%
88final int arrayDesignId = Values.getInt(request.getParameter("arraydesign_id"));
89final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
90final String ID = sc.getId();
91final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
92
93final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
94final String callback = request.getParameter("callback");
95final String title = mode.generateTitle("feature", "features");
96final DbControl dc = sc.newDbControl();
97DataResultIterator<FeatureData> features = null;
98try
99{
100  final ArrayDesign design = ArrayDesign.getById(dc, arrayDesignId);
101  final FeatureIdentificationMethod fiMethod = design.getFeatureIdentificationMethod();
102  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
103  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
104 
105  WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
106  WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
107 
108  final DataQuery<FeatureData> query = design.getFeatures();
109
110  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
111  final ItemQuery<ReporterType> typeQuery = ReporterType.getQuery();
112  typeQuery.order(Orders.asc(Hql.property("name")));
113  typeQuery.setCacheResult(true);
114 
115  List<ExtendedProperty> reporterProperties = ExtendedProperties.getProperties("ReporterData");
116 
117  Enumeration<String, String> plateRows = new Enumeration<String, String>();
118  final ItemQuery<PlateGeometry> geometryQuery = PlateGeometry.getQuery();
119  geometryQuery.order(Orders.desc(Hql.property("rows")));
120  ItemResultIterator<PlateGeometry> result = geometryQuery.iterate(dc);
121  int maxRows = result.next().getRows();
122  for (int row = 0; row < maxRows && row < 256; row++)
123  {
124    plateRows.add(Integer.toString(row), rowFormatter.format(row));
125  }
126 
127  Enumeration<String, String> plateColumns = new Enumeration<String, String>();
128  final ItemQuery<PlateGeometry> columnsGeometryQuery = PlateGeometry.getQuery();
129  columnsGeometryQuery.order(Orders.desc(Hql.property("columns")));
130  ItemResultIterator<PlateGeometry> columnsResult = columnsGeometryQuery.iterate(dc);
131  int maxColumns = columnsResult.next().getColumns();
132  for (int column = 0; column < maxColumns && column < 256; column++)
133  {
134    plateColumns.add(Integer.toString(column), columnFormatter.format(column));
135  }
136 
137  try
138  {
139    query.join(Hql.leftJoin(null, "reporter", "rpt", null, true));
140    cc.configureQuery(dc, query, true);
141    if (!"row".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("row")));
142    if (!"column".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("column")));
143    features = query.iterate(dc);
144  }
145  catch (Throwable t)
146  {
147    cc.setMessage(t.getMessage());
148    t.printStackTrace();
149  }
150  int numListed = 0;
151  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
152  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
153  ExtensionsInvoker columnsInvoker = ListColumnUtil.useExtensions(jspContext);
154  %>
155  <base:page title="<%=title%>" id="list-page">
156  <base:head scripts="table.js,tabcontrol-2.js,~features.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
157    <ext:scripts context="<%=jspContext%>" />
158    <ext:stylesheets context="<%=jspContext%>" />
159  </base:head>
160 
161  <base:body>
162    <p:path><p:pathelement 
163      title="Array designs" href="<%="../index.jsp?ID="+ID%>" 
164      /><p:pathelement title="<%=HTML.encodeTags(design.getName())%>" 
165      /></p:path>
166
167    <t:tabcontrol 
168      id="main" 
169      subclass="content mastertabcontrol"
170      active="images">
171    <t:tab id="properties" title="Properties" />
172    <t:tab id="annotations" title="Annotations" />
173   
174    <t:tab id="images" title="Features">
175    <tbl:table 
176      id="features" 
177      columns="<%=cc.getSetting("columns")%>"
178      sortby="<%=cc.getSortProperty()%>" 
179      direction="<%=cc.getSortDirection()%>"
180      action="index.jsp"
181      sc="<%=sc%>"
182      item="<%=itemType%>"
183      filterrows="<%=cc.getFilterRows()%>"
184      subclass="fulltable"
185      >
186      <tbl:hidden 
187        name="mode" 
188        value="<%=mode.getName()%>" 
189      />
190      <tbl:hidden 
191        name="arraydesign_id" 
192        value="<%=String.valueOf(arrayDesignId)%>" 
193      />
194      <tbl:hidden 
195        name="callback" 
196        value="<%=callback%>" 
197        skip="<%=callback == null%>" 
198      />
199      <tbl:columndef 
200        id="position"
201        clazz="uniquecol"
202        property="position"
203        datatype="int"
204        title="Position"
205        sortable="true" 
206        filterable="true"
207        exportable="true"
208        show="<%=fiMethod == FeatureIdentificationMethod.FEATURE_ID ? "auto" : "always"%>"
209      />
210      <tbl:columndef 
211        id="id"
212        clazz="uniquecol"
213        property="id"
214        datatype="int"
215        title="ID"
216        sortable="true"
217        filterable="true"
218        exportable="true"
219      />
220      <tbl:columndef 
221        id="externalId"
222        clazz="uniquecol"
223        property="externalId"
224        datatype="string"
225        title="Feature ID"
226        sortable="true" 
227        filterable="true"
228        exportable="true"
229        show="<%=fiMethod == FeatureIdentificationMethod.FEATURE_ID ? "always" : "auto"%>"
230      />
231      <tbl:columndef 
232        id="block"
233        property="arrayDesignBlock.blockNumber"
234        datatype="int"
235        title="Block"
236        sortable="true" 
237        filterable="true"
238        exportable="true"
239      />
240      <tbl:columndef 
241        id="metaGridX"
242        property="arrayDesignBlock.metaGridX"
243        datatype="int"
244        title="Meta grid X"
245        sortable="true" 
246        filterable="true"
247        exportable="true"
248      />
249      <tbl:columndef 
250        id="metaGridY"
251        property="arrayDesignBlock.metaGridY"
252        datatype="int"
253        title="Meta grid Y"
254        sortable="true" 
255        filterable="true"
256        exportable="true"
257      />
258      <tbl:columndef 
259        id="row"
260        property="row"
261        datatype="int"
262        title="Row"
263        sortable="true" 
264        filterable="true"
265        exportable="true"       
266      />
267      <tbl:columndef 
268        id="column"
269        property="column"
270        datatype="int"
271        title="Column"
272        sortable="true" 
273        filterable="true"
274        exportable="true"
275      />
276      <tbl:columndef 
277        id="blockSizeX"
278        property="arrayDesignBlock.blockSizeX"
279        datatype="int"
280        title="Block size X"
281        sortable="true" 
282        filterable="true"
283        exportable="true"
284      />
285      <tbl:columndef 
286        id="blockSizeY"
287        property="arrayDesignBlock.blockSizeY"
288        datatype="int"
289        title="Block size Y"
290        sortable="true" 
291        filterable="true"
292        exportable="true"
293      />
294      <tbl:columndef 
295        id="originX"
296        property="arrayDesignBlock.originX"
297        datatype="int"
298        title="Origin X"
299        sortable="true" 
300        filterable="true"
301        exportable="true"
302      />
303      <tbl:columndef 
304        id="originY"
305        property="arrayDesignBlock.originY"
306        datatype="int"
307        title="Origin Y"
308        sortable="true" 
309        filterable="true"
310        exportable="true"
311      />
312      <tbl:columndef 
313        id="spacingX"
314        property="arrayDesignBlock.spacingX"
315        datatype="int"
316        title="Spacing X"
317        sortable="true" 
318        filterable="true"
319        exportable="true"
320      />
321      <tbl:columndef 
322        id="spacingY"
323        property="arrayDesignBlock.spacingY"
324        datatype="int"
325        title="Spacing Y"
326        sortable="true" 
327        filterable="true"
328        exportable="true"
329      />
330      <tbl:columndef 
331        id="diameter"
332        property="arrayDesignBlock.featureDiameter"
333        datatype="int"
334        title="Diameter"
335        sortable="true" 
336        filterable="true"
337        exportable="true"
338      />
339      <tbl:columndef
340        id="reporterList"
341        property="$rpt.£reporterListScores"
342        datatype="int"
343        title="[Rep] Reporter list"
344        filterable="true"
345        enumeration="<%=Base.getReporterListsEnum(dc)%>"
346        multiple="false"
347      />
348      <tbl:columndef 
349        id="reporter.name"
350        property="$rpt.name"
351        exportproperty="reporter.name"
352        datatype="string"
353        title="[Rep] Name"
354        sortable="true" 
355        filterable="true"
356        exportable="true"
357      />
358      <tbl:columndef 
359        id="reporter.externalId"
360        clazz="uniquecol"
361        property="$rpt.externalId"
362        exportproperty="reporter.externalId"
363        datatype="string"
364        title="[Rep] ID"
365        sortable="true" 
366        filterable="true"
367        exportable="true"
368      />
369      <tbl:columndef 
370        id="reporter.symbol"
371        property="$rpt.symbol"
372        exportproperty="reporter.symbol"
373        datatype="string"
374        title="[Rep] Gene symbol"
375        sortable="true" 
376        filterable="true"
377        exportable="true"
378      />
379      <tbl:columndef 
380        id="reporter.description"
381        property="$rpt.description"
382        exportproperty="reporter.description"
383        datatype="string"
384        title="[Rep] Description" 
385        sortable="true" 
386        filterable="true" 
387        exportable="true"
388      />
389      <tbl:columndef 
390        id="reporter.entryDate"
391        property="$rpt.entryDate"
392        exportproperty="reporter.entryDate"
393        datatype="date"
394        title="[Rep] Registered"
395        sortable="true" 
396        filterable="true"
397        exportable="true"
398        formatter="<%=dateFormatter%>"
399      />
400      <tbl:columndef 
401        id="reporter.lastUpdate"
402        property="$rpt.lastUpdate"
403        exportproperty="reporter.lastUpdate"
404        datatype="timestamp"
405        title="[Rep] Last update" 
406        sortable="true" 
407        filterable="true" 
408        exportable="true"
409        formatter="<%=dateTimeFormatter%>"
410      />
411      <%
412      Enumeration<String, String> types = new Enumeration<String, String>();
413      ItemResultList<ReporterType> reporterTypes = typeQuery.list(dc);
414      types.add("", "- none -");
415      for (ReporterType rt : reporterTypes)
416      {
417        types.add(Integer.toString(rt.getId()), HTML.encodeTags(rt.getName()));
418      }
419      %>
420      <tbl:columndef 
421        id="reporter.reporterType"
422        property="$rpt.reporterType"
423        sortproperty="$rpt.reporterType.name"
424        exportproperty="reporter.reporterType.name:string"
425        datatype="int"
426        enumeration="<%=types%>"
427        title="[Rep] Type"
428        sortable="true" 
429        filterable="true"
430        exportable="true"
431      />
432      <%
433      if (reporterProperties != null)
434      {
435        for (ExtendedProperty ep : reporterProperties)
436        {
437          String name = ep.getName();
438          %>
439          <tbl:columndef
440            id="<%="reporter."+name%>"
441            property="<%="$rpt."+name%>"
442            exportproperty="<%="reporter."+name%>"
443            datatype="<%=ep.getType().getStringValue()%>"
444            title="<%="[Rep] "+HTML.encodeTags(ep.getTitle())%>"
445            sortable="true"
446            filterable="true"
447            exportable="true"
448            formatter="<%=FormatterFactory.getExtendedPropertyFormatter(sc, ep)%>"
449          />
450          <%
451        }
452      }
453      %>
454      <tbl:columndef 
455        id="well.row"
456        property="well.row"
457        datatype="int"
458        title="[Well] Row" 
459        sortable="true" 
460        filterable="true" 
461        enumeration="<%=plateRows%>"
462        exportable="true"
463        formatter="<%=rowFormatter%>"
464      />
465      <tbl:columndef 
466        id="well.column"
467        property="well.column"
468        datatype="int"
469        title="[Well] Column" 
470        sortable="true" 
471        filterable="true" 
472        enumeration="<%=plateColumns%>"
473        exportable="true"
474        formatter="<%=columnFormatter%>"
475      />
476      <tbl:columndef 
477        id="well.plate"
478        property="well.plate.name"
479        datatype="string"
480        title="[Well] Plate" 
481        sortable="true" 
482        filterable="true" 
483        exportable="true"
484      />
485      <tbl:columndef 
486        id="xt-columns" 
487        extensions="<%=columnsInvoker%>" 
488        jspcontext="<%=jspContext%>" 
489      />
490      <div class="panelgroup bg-filled-50 bottomborder">
491        <tbl:toolbar
492          subclass="bottomborder"
493          visible="<%=mode.hasToolbar()%>"
494          >
495          <tbl:button 
496            id="btnColumns"
497            image="columns.png" 
498            title="Columns&hellip;" 
499            tooltip="Show, hide and re-order columns" 
500          />
501          <tbl:button
502            id="btnNewReporterList"
503            image="add.png"
504            title="New reporter list&hellip;"
505            tooltip="Create a new reporter list from matching features"
506            visible="<%=sc.hasPermission(Permission.CREATE, Item.REPORTERLIST)%>"
507          />
508          <tbl:button 
509            id="btnImport"
510            data-plugin-type="IMPORT"
511            image="import.png" 
512            title="Import&hellip;" 
513            tooltip="Import data" 
514            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
515          />
516          <tbl:button 
517            id="btnExport"
518            data-plugin-type="EXPORT"
519            image="export.png" 
520            title="Export&hellip;" 
521            tooltip="Export data" 
522            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
523          />
524          <tbl:button 
525            id="btnRunPlugin"
526            data-plugin-type="OTHER"
527            image="runplugin.png" 
528            title="Run plugin&hellip;" 
529            tooltip="Run a plugin" 
530            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
531          />
532          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
533            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
534        </tbl:toolbar>
535        <tbl:panel>
536          <tbl:presetselector />
537          <tbl:navigator
538            page="<%=cc.getPage()%>" 
539            rowsperpage="<%=cc.getRowsPerPage()%>" 
540            totalrows="<%=features == null ? 0 : features.getTotalCount()%>" 
541            visible="<%=mode.hasNavigator()%>"
542          />
543        </tbl:panel>
544      </div>
545      <tbl:data>
546        <tbl:headers>
547          <tbl:headerrow>
548            <tbl:header colspan="3" />
549            <tbl:columnheaders />
550          </tbl:headerrow>
551          <%
552          int numFilters = cc.getNumPropertyFilters();
553          int numRows = cc.getFilterRows();
554          for (int filterNo = 0; filterNo < numRows; filterNo++)
555          {
556            boolean lastRow = filterNo == numRows-1;
557            %>
558            <tbl:headerrow>
559              <tbl:header subclass="index" />
560              <tbl:header 
561                subclass="check" 
562                visible="<%=mode.hasCheck()%>"
563                ><base:icon 
564                  id="check.uncheck"
565                  image="check_uncheck.png" 
566                  tooltip="Check/uncheck all" 
567                  visible="<%=lastRow%>"
568                /></tbl:header>
569              <tbl:header 
570                subclass="check" 
571                visible="<%=mode.hasRadio()%>"
572                />
573              <tbl:header 
574                subclass="icons" 
575                visible="<%=mode.hasIcons()%>"
576                >
577                <base:icon
578                  subclass="link table-filter-row-action"
579                  image="add.png"
580                  tooltip="Add extra filter row"
581                  visible="<%=lastRow%>"
582                /><base:icon
583                  subclass="link table-filter-row-action"
584                  image="remove.png"
585                  tooltip="Remove this filter row"
586                  visible="<%=numRows > 1 || numFilters > 0 %>"
587                  data-remove-row="<%=filterNo%>"
588                />
589              </tbl:header>
590              <tbl:propertyfilter row="<%=filterNo%>" />
591            </tbl:headerrow>
592            <%
593          }
594          %>
595        </tbl:headers>
596        <tbl:rows>
597          <%
598          if (cc.getMessage() != null)
599          {
600            %>
601            <tbl:panel subclass="bg-filled-50">
602              <div class="messagecontainer error"><%=cc.getMessage()%></div>
603            </tbl:panel>
604            <%
605            cc.setMessage(null);
606          }
607          int index = cc.getPage()*cc.getRowsPerPage();
608          int selectedItemId = Values.getInt(request.getParameter("item_id"));
609          if (features != null)
610          {
611            String tooltip = mode.isSelectionMode() ? 
612              "Select this item" : "View this item";
613            while (features.hasNext())
614            {
615              FeatureData item = features.next();
616              ArrayDesignBlock block = Feature.getArrayDesignBlock(dc, item);
617              int itemId = item.getId();
618              index++;
619              numListed++;
620              %>
621              <tbl:row>
622                <tbl:header 
623                  clazz="index"
624                  ><%=index%></tbl:header>
625                <tbl:header 
626                  clazz="check" 
627                  visible="<%=mode.hasCheck()%>"
628                  ><input 
629                      type="checkbox" 
630                      name="<%=itemId%>" 
631                      value="<%=itemId%>" 
632                      title="TODO" 
633                      <%=request.getParameter(Integer.toString(itemId)) == null ? "" : "checked"%> 
634                    ></tbl:header>
635                <tbl:header 
636                  clazz="check" 
637                  visible="<%=mode.hasRadio()%>"
638                  ><input 
639                      type="radio" 
640                      name="item_id" 
641                      value="<%=itemId%>" 
642                      title="TODO" 
643                      <%=selectedItemId == itemId ? "checked" : ""%>
644                    ></tbl:header>
645                <tbl:header 
646                  clazz="icons" 
647                  visible="<%=mode.hasIcons()%>"
648                  ></tbl:header>
649                <tbl:cell column="position"><div
650                    class="link table-item"
651                    data-item-id="<%=itemId%>"
652                    data-no-edit="1" 
653                    data-extra-url="&arraydesign_id=<%=arrayDesignId%>"
654                    tabindex="0"
655                    title="<%=tooltip%>"><%=item.getPosition()%></div></tbl:cell>
656                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
657                <tbl:cell column="externalId"><div
658                    class="link table-item"
659                    data-item-id="<%=itemId%>"
660                    data-no-edit="1" 
661                    data-extra-url="&arraydesign_id=<%=arrayDesignId%>"
662                    tabindex="0"
663                    title="<%=tooltip%>"><%=HTML.encodeTags(item.getExternalId())%></div></tbl:cell>
664                <tbl:cell column="block"><%=block.getBlockNumber()%></tbl:cell>
665                <tbl:cell column="row"><%=item.getRow()%></tbl:cell>
666                <tbl:cell column="column"><%=item.getColumn()%></tbl:cell>
667                <tbl:cell column="metaGridX"><%=block.getMetaGridX()%></tbl:cell>
668                <tbl:cell column="metaGridY"><%=block.getMetaGridY()%></tbl:cell>
669                <tbl:cell column="blockSizeX"><%=block.getBlockSizeX()%></tbl:cell>
670                <tbl:cell column="blockSizeY"><%=block.getBlockSizeY()%></tbl:cell>
671                <tbl:cell column="originX"><%=block.getOriginX()%></tbl:cell>
672                <tbl:cell column="originY"><%=block.getOriginY()%></tbl:cell>
673                <tbl:cell column="spacingX"><%=block.getSpacingX()%></tbl:cell>
674                <tbl:cell column="spacingY"><%=block.getSpacingY()%></tbl:cell>
675                <tbl:cell column="diameter"><%=block.getFeatureDiameter()%></tbl:cell>
676                <%
677                ReporterData reporter = item.getReporter();
678                if (reporter == null)
679                {
680                  %>
681                  <tbl:cell column="reporter.name"><i>- none -</i></tbl:cell>
682                  <tbl:cell column="reporter.externalId"><i>- none -</i></tbl:cell>
683                  <tbl:cell column="reporter.symbol"><i>- none -</i></tbl:cell>
684                  <tbl:cell column="reporter.description"><i>- none -</i></tbl:cell>
685                  <tbl:cell column="entryDate"><i>- none -</i></tbl:cell>
686                  <tbl:cell column="reporter.lastUpdate"><i>- none -</i></tbl:cell>
687                  <tbl:cell column="reporter.reporterType"><i>- none -</i></tbl:cell>
688                  <%
689                  if (reporterProperties != null)
690                  {
691                    for (ExtendedProperty ep : reporterProperties)
692                    {
693                      String name = ep.getName();
694                      %>
695                      <tbl:cell column="<%="reporter."+name%>"><i>- none -</i></tbl:cell>
696                      <%
697                    }
698                  }
699                }
700                else
701                {
702                  %>
703                  <tbl:cell column="reporter.name"><%=Base.getLink(ID, reporter.getName(), Item.REPORTER, reporter.getId(), true)%></tbl:cell>
704                  <tbl:cell column="reporter.externalId"><%=HTML.encodeTags(reporter.getExternalId())%></tbl:cell>
705                  <tbl:cell column="reporter.symbol"><%=HTML.encodeTags(reporter.getSymbol())%></tbl:cell>
706                  <tbl:cell column="reporter.description"><%=HTML.encodeTags(reporter.getDescription())%></tbl:cell>
707                  <tbl:cell column="reporter.entryDate" value="<%=reporter.getEntryDate()%>" />
708                  <tbl:cell column="reporter.lastUpdate" value="<%=reporter.getLastUpdate()%>" />
709                  <tbl:cell column="reporter.reporterType"
710                    ><base:propertyvalue 
711                      dbcontrol="<%=dc%>" 
712                      item="<%=reporter%>" 
713                      property="reporterType"
714                      enableEditLink="<%=mode.hasEditLink()%>" 
715                      enablePropertyLink="<%=mode.hasPropertyLink()%>"
716                    /></tbl:cell>
717                  <%
718                  if (reporterProperties != null)
719                  {
720                    for (ExtendedProperty ep : reporterProperties)
721                    {
722                      String name = ep.getName();
723                      %>
724                      <tbl:cell column="<%="reporter."+name%>"><tbl:cellvalue value="<%=reporter.getExtended(name)%>" /></tbl:cell>
725                      <%
726                    }
727                  }
728                }
729                %>
730                <%
731                Well well = null;
732                boolean readWell = true;
733                try
734                {
735                  well = Feature.getWell(dc, item);
736                }
737                catch (PermissionDeniedException ex)
738                {
739                  readWell = false;
740                }
741                if (!readWell)
742                {
743                  %>
744                  <tbl:cell column="well.row"><i>- denied -</i></tbl:cell>
745                  <tbl:cell column="well.column"><i>- denied -</i></tbl:cell>
746                  <tbl:cell column="well.plate"><i>- denied -</i></tbl:cell>
747                  <%
748                }
749                else if (well == null)
750                {
751                  %>
752                  <tbl:cell column="well.row"><i>- none -</i></tbl:cell>
753                  <tbl:cell column="well.column"><i>- none -</i></tbl:cell>
754                  <tbl:cell column="well.plate"><i>- none -</i></tbl:cell>
755                  <%
756                }
757                else
758                {
759                  %>
760                  <tbl:cell column="well.row"><tbl:cellvalue value="<%=well.getRow()%>"/></tbl:cell>
761                  <tbl:cell column="well.column"><tbl:cellvalue value="<%=well.getColumn()%>"/></tbl:cell>
762                  <tbl:cell column="well.plate"><%=Base.getLinkedName(ID, well.getPlate(), false, true)%></tbl:cell>
763                  <%
764                }
765                %>
766                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
767                  <tbl:cell column="xt-columns" />
768                </tbl:xt-cells>
769              </tbl:row>
770              <%
771            }
772          }
773          if (numListed == 0)
774          {
775            %>
776            <tbl:panel subclass="bg-filled-50">
777              <div class="messagecontainer note">
778              <%=features == null || features.getTotalCount() == 0 ? "No features were found" : "No features on this page. Please select another page!" %>
779              </div>
780            </tbl:panel>
781            <%
782          }
783          %>
784          </tbl:rows>
785        </tbl:data>
786    </tbl:table>
787    </t:tab>
788    <t:tab id="overview" title="Overview" 
789      tooltip="Display a tree overview of related items" />
790    <t:tab id="history" title="Change history" 
791        tooltip="Displays a log of all modifications made to this item"
792        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
793    </t:tabcontrol>
794
795    <base:buttongroup>
796      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
797      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
798      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
799    </base:buttongroup>
800 
801  </base:body>
802  </base:page>
803  <%
804}
805finally
806{
807  if (features != null) features.close();
808  if (dc != null) dc.close();
809}
810%>
Note: See TracBrowser for help on using the repository browser.