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

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

Merged patch release 3.6.2 to the trunk

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