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