source: branches/3.18-stable/www/lims/arraydesigns/features/list_features.jsp @ 7939

Last change on this file since 7939 was 7939, checked in by Nicklas Nordborg, 6 months ago

References #2246: Sticky table headers

It should now be implemented on all list pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 26.0 KB
Line 
1<%-- $Id: list_features.jsp 7939 2021-05-04 07:30:31Z 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"
189      stickyheaders="<%=fiMethod == FeatureIdentificationMethod.FEATURE_ID ? "externalId" : "position"%>"
190      >
191      <tbl:hidden 
192        name="mode" 
193        value="<%=mode.getName()%>" 
194      />
195      <tbl:hidden 
196        name="arraydesign_id" 
197        value="<%=String.valueOf(arrayDesignId)%>" 
198      />
199      <tbl:hidden 
200        name="callback" 
201        value="<%=callback%>" 
202        skip="<%=callback == null%>" 
203      />
204      <tbl:columndef 
205        id="position"
206        clazz="uniquecol"
207        property="position"
208        datatype="int"
209        title="Position"
210        sortable="true" 
211        filterable="true"
212        exportable="true"
213        show="<%=fiMethod == FeatureIdentificationMethod.FEATURE_ID ? "auto" : "always"%>"
214      />
215      <tbl:columndef 
216        id="id"
217        clazz="uniquecol"
218        property="id"
219        datatype="int"
220        title="ID"
221        sortable="true"
222        filterable="true"
223        exportable="true"
224      />
225      <tbl:columndef 
226        id="externalId"
227        clazz="uniquecol"
228        property="externalId"
229        datatype="string"
230        title="Feature ID"
231        sortable="true" 
232        filterable="true"
233        exportable="true"
234        show="<%=fiMethod == FeatureIdentificationMethod.FEATURE_ID ? "always" : "auto"%>"
235      />
236      <tbl:columndef 
237        id="block"
238        property="arrayDesignBlock.blockNumber"
239        datatype="int"
240        title="Block"
241        sortable="true" 
242        filterable="true"
243        exportable="true"
244      />
245      <tbl:columndef 
246        id="metaGridX"
247        property="arrayDesignBlock.metaGridX"
248        datatype="int"
249        title="Meta grid X"
250        sortable="true" 
251        filterable="true"
252        exportable="true"
253      />
254      <tbl:columndef 
255        id="metaGridY"
256        property="arrayDesignBlock.metaGridY"
257        datatype="int"
258        title="Meta grid Y"
259        sortable="true" 
260        filterable="true"
261        exportable="true"
262      />
263      <tbl:columndef 
264        id="row"
265        property="row"
266        datatype="int"
267        title="Row"
268        sortable="true" 
269        filterable="true"
270        exportable="true"       
271      />
272      <tbl:columndef 
273        id="column"
274        property="column"
275        datatype="int"
276        title="Column"
277        sortable="true" 
278        filterable="true"
279        exportable="true"
280      />
281      <tbl:columndef 
282        id="blockSizeX"
283        property="arrayDesignBlock.blockSizeX"
284        datatype="int"
285        title="Block size X"
286        sortable="true" 
287        filterable="true"
288        exportable="true"
289      />
290      <tbl:columndef 
291        id="blockSizeY"
292        property="arrayDesignBlock.blockSizeY"
293        datatype="int"
294        title="Block size Y"
295        sortable="true" 
296        filterable="true"
297        exportable="true"
298      />
299      <tbl:columndef 
300        id="originX"
301        property="arrayDesignBlock.originX"
302        datatype="int"
303        title="Origin X"
304        sortable="true" 
305        filterable="true"
306        exportable="true"
307      />
308      <tbl:columndef 
309        id="originY"
310        property="arrayDesignBlock.originY"
311        datatype="int"
312        title="Origin Y"
313        sortable="true" 
314        filterable="true"
315        exportable="true"
316      />
317      <tbl:columndef 
318        id="spacingX"
319        property="arrayDesignBlock.spacingX"
320        datatype="int"
321        title="Spacing X"
322        sortable="true" 
323        filterable="true"
324        exportable="true"
325      />
326      <tbl:columndef 
327        id="spacingY"
328        property="arrayDesignBlock.spacingY"
329        datatype="int"
330        title="Spacing Y"
331        sortable="true" 
332        filterable="true"
333        exportable="true"
334      />
335      <tbl:columndef 
336        id="diameter"
337        property="arrayDesignBlock.featureDiameter"
338        datatype="int"
339        title="Diameter"
340        sortable="true" 
341        filterable="true"
342        exportable="true"
343      />
344      <tbl:columndef
345        id="reporterList"
346        property="$rpt.£reporterListScores"
347        datatype="int"
348        title="[Rep] Reporter list"
349        filterable="true"
350        enumeration="<%=Base.getReporterListsEnum(dc)%>"
351        multiple="false"
352      />
353      <tbl:columndef 
354        id="reporter.name"
355        property="$rpt.name"
356        exportproperty="reporter.name"
357        datatype="string"
358        title="[Rep] Name"
359        sortable="<%=readReporter%>" 
360        filterable="<%=readReporter%>"
361        exportable="<%=readReporter%>"
362      />
363      <%
364      if (readReporter)
365      {
366        %>
367        <tbl:columndef 
368          id="reporter.externalId"
369          clazz="uniquecol"
370          property="$rpt.externalId"
371          exportproperty="reporter.externalId"
372          datatype="string"
373          title="[Rep] ID"
374          sortable="true" 
375          filterable="true"
376          exportable="true"
377        />
378        <tbl:columndef 
379          id="reporter.symbol"
380          property="$rpt.symbol"
381          exportproperty="reporter.symbol"
382          datatype="string"
383          title="[Rep] Gene symbol"
384          sortable="true" 
385          filterable="true"
386          exportable="true"
387        />
388        <tbl:columndef 
389          id="reporter.description"
390          property="$rpt.description"
391          exportproperty="reporter.description"
392          datatype="string"
393          title="[Rep] Description" 
394          sortable="true" 
395          filterable="true" 
396          exportable="true"
397        />
398        <tbl:columndef 
399          id="reporter.entryDate"
400          property="$rpt.entryDate"
401          exportproperty="reporter.entryDate"
402          datatype="date"
403          title="[Rep] Registered"
404          sortable="true" 
405          filterable="true"
406          exportable="true"
407          formatter="<%=dateFormatter%>"
408        />
409        <tbl:columndef 
410          id="reporter.lastUpdate"
411          property="$rpt.lastUpdate"
412          exportproperty="reporter.lastUpdate"
413          datatype="timestamp"
414          title="[Rep] Last update" 
415          sortable="true" 
416          filterable="true" 
417          exportable="true"
418          formatter="<%=dateTimeFormatter%>"
419        />
420        <%
421        Enumeration<String, String> types = new Enumeration<String, String>();
422        ItemResultList<ReporterType> reporterTypes = typeQuery.list(dc);
423        types.add("", "- none -");
424        for (ReporterType rt : reporterTypes)
425        {
426          types.add(Integer.toString(rt.getId()), HTML.encodeTags(rt.getName()));
427        }
428        %>
429        <tbl:columndef 
430          id="reporter.reporterType"
431          property="$rpt.reporterType"
432          sortproperty="$rpt.reporterType.name"
433          exportproperty="reporter.reporterType.name:string"
434          datatype="int"
435          enumeration="<%=types%>"
436          title="[Rep] Type"
437          sortable="true" 
438          filterable="true"
439          exportable="true"
440        />
441        <%
442        if (reporterProperties != null)
443        {
444          for (ExtendedProperty ep : reporterProperties)
445          {
446            String name = ep.getName();
447            %>
448            <tbl:columndef
449              id="<%="reporter."+name%>"
450              property="<%="$rpt."+name%>"
451              exportproperty="<%="reporter."+name%>"
452              datatype="<%=ep.getType().getStringValue()%>"
453              title="<%="[Rep] "+HTML.encodeTags(ep.getTitle())%>"
454              sortable="true"
455              filterable="true"
456              exportable="true"
457              formatter="<%=FormatterFactory.getExtendedPropertyFormatter(sc, ep)%>"
458            />
459            <%
460          }
461        }
462      } 
463      %>
464      <tbl:columndef 
465        id="well.row"
466        property="well.row"
467        datatype="int"
468        title="[Well] Row" 
469        sortable="true" 
470        filterable="true" 
471        enumeration="<%=plateRows%>"
472        exportable="true"
473        formatter="<%=rowFormatter%>"
474      />
475      <tbl:columndef 
476        id="well.column"
477        property="well.column"
478        datatype="int"
479        title="[Well] Column" 
480        sortable="true" 
481        filterable="true" 
482        enumeration="<%=plateColumns%>"
483        exportable="true"
484        formatter="<%=columnFormatter%>"
485      />
486      <tbl:columndef 
487        id="well.plate"
488        property="well.plate.name"
489        datatype="string"
490        title="[Well] Plate" 
491        sortable="true" 
492        filterable="true" 
493        exportable="true"
494      />
495      <tbl:columndef 
496        id="xt-columns" 
497        extensions="<%=columnsInvoker%>" 
498        jspcontext="<%=jspContext%>" 
499      />
500      <div class="panelgroup bg-filled-50 bottomborder">
501        <tbl:toolbar
502          subclass="bottomborder"
503          visible="<%=mode.hasToolbar()%>"
504          >
505          <tbl:button 
506            id="btnColumns"
507            image="columns.png" 
508            title="Columns&hellip;" 
509            tooltip="Show, hide and re-order columns" 
510          />
511          <tbl:button
512            id="btnNewReporterList"
513            image="add.png"
514            title="New reporter list&hellip;"
515            tooltip="Create a new reporter list from matching features"
516            visible="<%=sc.hasPermission(Permission.CREATE, Item.REPORTERLIST)%>"
517          />
518          <tbl:button 
519            id="btnImport"
520            data-plugin-type="IMPORT"
521            image="import.png" 
522            title="Import&hellip;" 
523            tooltip="Import data" 
524            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
525          />
526          <tbl:button 
527            id="btnExport"
528            data-plugin-type="EXPORT"
529            image="export.png" 
530            title="Export&hellip;" 
531            tooltip="Export data" 
532            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
533          />
534          <tbl:button 
535            id="btnRunPlugin"
536            data-plugin-type="OTHER"
537            image="runplugin.png" 
538            title="Run plugin&hellip;" 
539            tooltip="Run a plugin" 
540            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
541          />
542          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
543            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
544        </tbl:toolbar>
545        <tbl:panel>
546          <tbl:presetselector />
547          <tbl:navigator
548            page="<%=cc.getPage()%>" 
549            rowsperpage="<%=cc.getRowsPerPage()%>" 
550            totalrows="<%=features == null ? 0 : features.getTotalCount()%>" 
551            visible="<%=mode.hasNavigator()%>"
552          />
553        </tbl:panel>
554      </div>
555      <tbl:data>
556        <tbl:headers>
557          <tbl:headerrow>
558            <tbl:header clazz="row-index bg-filled-100" />
559            <tbl:columnheaders />
560          </tbl:headerrow>
561          <%
562          int numFilters = cc.getNumPropertyFilters();
563          int numRows = cc.getFilterRows();
564          for (int filterNo = 0; filterNo < numRows; filterNo++)
565          {
566            boolean lastRow = filterNo == numRows-1;
567            %>
568            <tbl:headerrow>
569              <tbl:header subclass="row-index bg-filled-100">
570                <div class="index-<%=mode.getName()%>">
571                  <div class="index"></div>
572                  <div class="check">
573                    <base:icon 
574                      subclass="link table-check"
575                      image="check_uncheck.png" 
576                      tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
577                      visible="<%=lastRow && mode.hasCheck()%>"
578                    />
579                  </div>
580                  <div class="icons">
581                    <base:icon
582                      subclass="link table-filter-row-action"
583                      image="add.png"
584                      tooltip="Add extra filter row"
585                      visible="<%=lastRow%>"
586                    /><base:icon
587                      subclass="link table-filter-row-action"
588                      image="remove.png"
589                      tooltip="Remove this filter row"
590                      visible="<%=numRows > 1 || numFilters > 0 %>"
591                      data-remove-row="<%=filterNo%>"
592                    />
593                  </div>
594                </div>
595              </tbl:header>
596              <tbl:propertyfilter row="<%=filterNo%>" />
597            </tbl:headerrow>
598            <%
599          }
600          %>
601          <tbl:columnsubtitles />
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 clazz="row-index bg-filled-100">
630                  <div class="index-<%=mode.getName()%>">
631                    <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
632                    <div class="check">                 
633                      <base:input
634                        type="checkbox" 
635                        name="<%=itemId%>" 
636                        value="<%=itemId%>" 
637                        checked="<%=request.getParameter(Integer.toString(itemId)) != null%>"
638                        visible="<%=mode.hasCheck()%>"
639                      />                   
640                      <base:input 
641                        type="radio" 
642                        name="item_id" 
643                        value="<%=itemId%>" 
644                        checked="<%=selectedItemId == itemId%>"
645                        visible="<%=mode.hasRadio()%>"
646                      />
647                    </div>
648                    <div class="icons"></div>
649                  </div>
650                </tbl:header>
651                <tbl:cell column="position"><div
652                    class="link table-item"
653                    data-item-id="<%=itemId%>"
654                    data-no-edit="1" 
655                    data-extra-url="&arraydesign_id=<%=arrayDesignId%>"
656                    tabindex="0"
657                    title="<%=tooltip%>"><%=item.getPosition()%></div></tbl:cell>
658                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
659                <tbl:cell column="externalId"><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%>"><%=HTML.encodeTags(item.getExternalId())%></div></tbl:cell>
666                <tbl:cell column="block"><%=block.getBlockNumber()%></tbl:cell>
667                <tbl:cell column="row"><%=item.getRow()%></tbl:cell>
668                <tbl:cell column="column"><%=item.getColumn()%></tbl:cell>
669                <tbl:cell column="metaGridX"><%=block.getMetaGridX()%></tbl:cell>
670                <tbl:cell column="metaGridY"><%=block.getMetaGridY()%></tbl:cell>
671                <tbl:cell column="blockSizeX"><%=block.getBlockSizeX()%></tbl:cell>
672                <tbl:cell column="blockSizeY"><%=block.getBlockSizeY()%></tbl:cell>
673                <tbl:cell column="originX"><%=block.getOriginX()%></tbl:cell>
674                <tbl:cell column="originY"><%=block.getOriginY()%></tbl:cell>
675                <tbl:cell column="spacingX"><%=block.getSpacingX()%></tbl:cell>
676                <tbl:cell column="spacingY"><%=block.getSpacingY()%></tbl:cell>
677                <tbl:cell column="diameter"><%=block.getFeatureDiameter()%></tbl:cell>
678                <%
679                if (!readReporter)
680                {
681                  %>
682                  <tbl:cell column="reporter.name"><i>- denied -</i></tbl:cell>
683                  <%
684                }
685                else
686                {
687                  ReporterData reporter = item.getReporter();
688                  if (reporter == null)
689                  {
690                    %>
691                    <tbl:cell column="reporter.name"><i>- none -</i></tbl:cell>
692                    <tbl:cell column="reporter.externalId"><i>- none -</i></tbl:cell>
693                    <tbl:cell column="reporter.symbol"><i>- none -</i></tbl:cell>
694                    <tbl:cell column="reporter.description"><i>- none -</i></tbl:cell>
695                    <tbl:cell column="entryDate"><i>- none -</i></tbl:cell>
696                    <tbl:cell column="reporter.lastUpdate"><i>- none -</i></tbl:cell>
697                    <tbl:cell column="reporter.reporterType"><i>- none -</i></tbl:cell>
698                    <%
699                    if (reporterProperties != null)
700                    {
701                      for (ExtendedProperty ep : reporterProperties)
702                      {
703                        String name = ep.getName();
704                        %>
705                        <tbl:cell column="<%="reporter."+name%>"><i>- none -</i></tbl:cell>
706                        <%
707                      }
708                    }
709                  }
710                  else
711                  {
712                    %>
713                    <tbl:cell column="reporter.name"><%=Base.getLink(ID, reporter.getName(), Item.REPORTER, reporter.getId(), true)%></tbl:cell>
714                    <tbl:cell column="reporter.externalId"><%=HTML.encodeTags(reporter.getExternalId())%></tbl:cell>
715                    <tbl:cell column="reporter.symbol"><%=HTML.encodeTags(reporter.getSymbol())%></tbl:cell>
716                    <tbl:cell column="reporter.description"><%=HTML.encodeTags(reporter.getDescription())%></tbl:cell>
717                    <tbl:cell column="reporter.entryDate" value="<%=reporter.getEntryDate()%>" />
718                    <tbl:cell column="reporter.lastUpdate" value="<%=reporter.getLastUpdate()%>" />
719                    <tbl:cell column="reporter.reporterType"
720                      ><base:propertyvalue 
721                        dbcontrol="<%=dc%>" 
722                        item="<%=reporter%>" 
723                        property="reporterType"
724                        enableEditLink="<%=mode.hasEditLink()%>" 
725                        enablePropertyLink="<%=mode.hasPropertyLink()%>"
726                      /></tbl:cell>
727                    <%
728                    if (reporterProperties != null)
729                    {
730                      for (ExtendedProperty ep : reporterProperties)
731                      {
732                        String name = ep.getName();
733                        %>
734                        <tbl:cell column="<%="reporter."+name%>"><tbl:cellvalue value="<%=reporter.getExtended(name)%>" /></tbl:cell>
735                        <%
736                      }
737                    }
738                  }
739                }
740                %>
741                <%
742                Well well = null;
743                boolean readWell = true;
744                try
745                {
746                  well = Feature.getWell(dc, item);
747                }
748                catch (PermissionDeniedException ex)
749                {
750                  readWell = false;
751                }
752                if (!readWell)
753                {
754                  %>
755                  <tbl:cell column="well.row"><i>- denied -</i></tbl:cell>
756                  <tbl:cell column="well.column"><i>- denied -</i></tbl:cell>
757                  <tbl:cell column="well.plate"><i>- denied -</i></tbl:cell>
758                  <%
759                }
760                else if (well == null)
761                {
762                  %>
763                  <tbl:cell column="well.row"><i>- none -</i></tbl:cell>
764                  <tbl:cell column="well.column"><i>- none -</i></tbl:cell>
765                  <tbl:cell column="well.plate"><i>- none -</i></tbl:cell>
766                  <%
767                }
768                else
769                {
770                  %>
771                  <tbl:cell column="well.row"><tbl:cellvalue value="<%=well.getRow()%>"/></tbl:cell>
772                  <tbl:cell column="well.column"><tbl:cellvalue value="<%=well.getColumn()%>"/></tbl:cell>
773                  <tbl:cell column="well.plate"><%=Base.getLinkedName(ID, well.getPlate(), false, true)%></tbl:cell>
774                  <%
775                }
776                %>
777                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
778                  <tbl:cell column="xt-columns" />
779                </tbl:xt-cells>
780              </tbl:row>
781              <%
782            }
783          }
784          if (numListed == 0)
785          {
786            %>
787            <tbl:panel subclass="bg-filled-50">
788              <div class="messagecontainer note">
789              <%=features == null || features.getTotalCount() == 0 ? "No features were found" : "No features on this page. Please select another page!" %>
790              </div>
791            </tbl:panel>
792            <%
793          }
794          %>
795          </tbl:rows>
796        </tbl:data>
797    </tbl:table>
798    </t:tab>
799    <t:tab id="overview" title="Overview" 
800      tooltip="Display a tree overview of related items" />
801    <t:tab id="history" title="History"
802      tooltip="Displays a log with the history of this item"
803      visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
804    </t:tabcontrol>
805
806    <base:buttongroup>
807      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
808      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
809      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
810    </base:buttongroup>
811 
812  </base:body>
813  </base:page>
814  <%
815}
816finally
817{
818  if (features != null) features.close();
819  if (dc != null) dc.close();
820}
821%>
Note: See TracBrowser for help on using the repository browser.