source: branches/3.18-stable/www/views/formulas/list_formulas.jsp @ 7932

Last change on this file since 7932 was 7932, checked in by Nicklas Nordborg, 3 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: 20.8 KB
Line 
1<%-- $Id: list_formulas.jsp 7932 2021-04-28 07:16:56Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Nicklas Nordborg, Martin Svensson
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author 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.Formula"
31  import="net.sf.basedb.core.Type"
32  import="net.sf.basedb.core.IntensityTransform"
33  import="net.sf.basedb.core.ItemQuery"
34  import="net.sf.basedb.core.ItemResultIterator"
35  import="net.sf.basedb.core.ItemContext"
36  import="net.sf.basedb.core.Nameable"
37  import="net.sf.basedb.core.Permission"
38  import="net.sf.basedb.core.RawDataTypes"
39  import="net.sf.basedb.core.RawDataType"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.plugin.GuiContext"
42  import="net.sf.basedb.core.plugin.Plugin"
43  import="net.sf.basedb.util.Enumeration"
44  import="net.sf.basedb.util.ShareableUtil"
45  import="net.sf.basedb.clients.web.Base"
46  import="net.sf.basedb.clients.web.ModeInfo"
47  import="net.sf.basedb.clients.web.PermissionUtil"
48  import="net.sf.basedb.clients.web.util.HTML"
49  import="net.sf.basedb.util.Values"
50  import="net.sf.basedb.util.formatter.Formatter"
51  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
52  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
53  import="net.sf.basedb.clients.web.extensions.JspContext"
54  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
55  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
56  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
57  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
58  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
59  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
60  import="java.util.Date"
61  import="java.util.Iterator"
62  import="java.util.List"
63  import="java.util.Map"
64%>
65<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
66<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
67<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
68<%!
69  private static final Item itemType = Item.FORMULA;
70  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
71 
72  private static final Enumeration<String, String> types = new Enumeration<String, String>();
73  private static final Enumeration<String, String> parsers = new Enumeration<String, String>();
74  private static final Enumeration<String, String> avgMethods = new Enumeration<String, String>();
75  private static final Enumeration<String, String> transforms = new Enumeration<String, String>();
76  private static final Enumeration<String, String> rawEnumeration = new Enumeration<String, String>();
77  private static final Enumeration<String, String> valueTypes = new Enumeration<String, String>();
78  static
79  {
80    for (Formula.Type t : Formula.Type.values())
81    {
82      types.add(Integer.toString(t.getValue()), HTML.encodeTags(t.toString()));
83    }
84    valueTypes.add("", "- unknown -");
85    for (Type v : Type.values())
86    {
87      valueTypes.add(Integer.toString(v.getValue()), v.toString());
88    }
89    for (Formula.Parser p : Formula.Parser.values())
90    {
91      parsers.add(Integer.toString(p.getValue()), HTML.encodeTags(p.toString()));
92    }
93    for (Formula.AverageMethod m : Formula.AverageMethod.values())
94    {
95      avgMethods.add(Integer.toString(m.getValue()), HTML.encodeTags(m.toString()));
96    }
97    transforms.add("", "- any -");
98    for (IntensityTransform t : IntensityTransform.values())
99    {
100      transforms.add(Integer.toString(t.getValue()), HTML.encodeTags(t.toString()));
101    }
102    rawEnumeration.add("", "- none -");
103    for (RawDataType rdt : RawDataTypes.getRawDataTypes())
104    {
105      rawEnumeration.add(rdt.getId(), HTML.encodeTags(rdt.getName()));
106    }
107    rawEnumeration.sortValues();
108  }
109%>
110<%
111final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
112final String ID = sc.getId();
113final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
114final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
115
116final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
117final String callback = request.getParameter("callback");
118final String title = mode.generateTitle("formula", "formulas");
119final DbControl dc = sc.newDbControl();
120ItemResultIterator<Formula> formulas = null;
121try
122{
123  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
124  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
125  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
126  try
127  {
128    final ItemQuery<Formula> query = Base.getConfiguredQuery(dc, cc, jspContext, true, Formula.getQuery(), mode);
129    formulas = query.iterate(dc);
130  }
131  catch (Throwable t)
132  {
133    t.printStackTrace();
134    cc.setMessage(t.getMessage());
135  }
136  int numListed = 0;
137  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
138  ExtensionsInvoker<ListColumnAction<Formula,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
139  %>
140  <base:page title="<%=title==null ? "Formulas" : title%>" type="<%=mode.getPageType()%>" id="list-page">
141  <base:head scripts="table.js,~formulas.js" styles="table.css,toolbar.css">
142    <ext:scripts context="<%=jspContext%>" />
143    <ext:stylesheets context="<%=jspContext%>" />
144  </base:head>
145 
146  <base:body>
147    <h1><%=title==null ? "Formulas" : title%></h1>
148    <div class="content">
149    <tbl:table 
150      id="formulas" 
151      columns="<%=cc.getSetting("columns")%>"
152      sortby="<%=cc.getSortProperty()%>" 
153      direction="<%=cc.getSortDirection()%>"
154      action="index.jsp"
155      sc="<%=sc%>"
156      item="<%=itemType%>"
157      filterrows="<%=cc.getFilterRows()%>"
158      subclass="fulltable sticky-headers"
159      >
160      <tbl:hidden 
161        name="mode" 
162        value="<%=mode.getName()%>" 
163      />
164      <tbl:hidden 
165        name="callback" 
166        value="<%=callback%>" 
167        skip="<%=callback == null%>" 
168      />
169      <tbl:columndef 
170        id="name"
171        property="name"
172        datatype="string"
173        title="Name"
174        sortable="true" 
175        filterable="true"
176        exportable="true"
177        show="always" 
178      />
179      <tbl:columndef 
180        id="id"
181        clazz="uniquecol"
182        property="id"
183        datatype="int"
184        title="ID"
185        sortable="true"
186        filterable="true"
187        exportable="true"
188      />
189      <tbl:columndef 
190        id="entryDate"
191        property="entryDate"
192        datatype="date"
193        title="Registered"
194        sortable="true" 
195        filterable="true"
196        exportable="true"
197        formatter="<%=dateFormatter%>"
198      />
199      <tbl:columndef 
200        id="type"
201        property="type"
202        datatype="int"
203        enumeration="<%=types%>"
204        title="Type"
205        sortable="true" 
206        filterable="true"
207        exportable="true"
208      />
209      <tbl:columndef 
210        id="parser"
211        property="parser"
212        datatype="int"
213        enumeration="<%=parsers%>"
214        title="Parser"
215        sortable="true" 
216        filterable="true"
217        exportable="true"
218      />
219      <tbl:columndef 
220        id="valueType"
221        property="valueType"
222        datatype="int"
223        enumeration="<%=valueTypes%>"
224        title="Value type"
225        sortable="true" 
226        filterable="true"
227        exportable="true"
228      />
229      <tbl:columndef 
230        id="averageMethod"
231        property="averageMethod"
232        datatype="int"
233        enumeration="<%=avgMethods%>"
234        title="Avg. method"
235        sortable="true" 
236        filterable="true"
237        exportable="true"
238      />
239      <tbl:columndef 
240        id="sourceIntensityTransform"
241        property="sourceIntensityTransform"
242        datatype="int"
243        enumeration="<%=transforms%>"
244        title="Source intensity transform"
245        sortable="true" 
246        filterable="true"
247        exportable="true"
248      />
249      <tbl:columndef 
250        id="resultIntensityTransform"
251        property="resultIntensityTransform"
252        datatype="int"
253        enumeration="<%=transforms%>"
254        title="Result intensity transform"
255        sortable="true" 
256        filterable="true"
257        exportable="true"
258      />
259      <tbl:columndef 
260        id="rawDataType"
261        property="rawDataType"
262        datatype="string"
263        enumeration="<%=rawEnumeration%>"
264        title="Raw data type"
265        sortable="true" 
266        filterable="true"
267        exportable="true"
268      />
269      <tbl:columndef 
270        id="channels"
271        property="channels"
272        datatype="int"
273        title="Channels"
274        sortable="true" 
275        filterable="true"
276        exportable="true"
277      />
278      <tbl:columndef 
279        id="formulas"
280        property="formulas"
281        datatype="string"
282        title="Formulas"
283        sortable="false" 
284        filterable="false"
285        exportable="true"
286      />
287      <tbl:columndef 
288        id="useColors"
289        property="coloring#usingColors"
290        datatype="boolean"
291        title="Use colors"
292        sortable="true" 
293        filterable="true"
294        exportable="true"
295      />
296      <tbl:columndef 
297        id="logarithmic"
298        property="coloring#logarithmic"
299        datatype="boolean"
300        title="Logarithmic"
301        sortable="true" 
302        filterable="true"
303        exportable="true"
304      />
305      <tbl:columndef 
306        id="minValue"
307        property="coloring#minValue"
308        datatype="float"
309        title="Min value"
310        sortable="true" 
311        filterable="true"
312        exportable="true"
313      />
314      <tbl:columndef 
315        id="midValue"
316        property="coloring#midValue"
317        datatype="float"
318        title="Mid value"
319        sortable="true" 
320        filterable="true"
321        exportable="true"
322      />
323      <tbl:columndef 
324        id="maxValue"
325        property="coloring#maxValue"
326        datatype="float"
327        title="Max value"
328        sortable="true" 
329        filterable="true"
330        exportable="true"
331      />
332      <tbl:columndef 
333        id="owner"
334        property="owner.name"
335        datatype="string"
336        title="Owner"
337        sortable="true" 
338        filterable="true"
339        exportable="true"
340      />
341      <tbl:columndef 
342        id="description"
343        property="description"
344        datatype="string"
345        title="Description" 
346        sortable="true" 
347        filterable="true" 
348        exportable="true"
349      />
350      <tbl:columndef
351        id="permission"
352        title="Permission"
353      />
354      <tbl:columndef
355        id="sharedTo"
356        title="Shared to"
357        filterable="true"
358        filterproperty="!sharedTo.name"
359        datatype="string"
360      />
361      <tbl:columndef 
362        id="xt-columns" 
363        extensions="<%=columnsInvoker%>" 
364        jspcontext="<%=jspContext%>" 
365      />
366      <div class="panelgroup bg-filled-50 bottomborder">
367        <tbl:toolbar
368          subclass="bottomborder"
369          visible="<%=mode.hasToolbar()%>"
370          >
371          <tbl:button 
372            id="btnNewItem"
373            disabled="<%=!createPermission%>" 
374            image="new.png" 
375            title="New&hellip;" 
376            tooltip="<%=createPermission ? "Create new formula" : "You do not have permission to create formulas"%>" 
377          />
378          <tbl:button 
379            id="btnDeleteItems"
380            image="delete.png"
381            title="Delete" 
382            tooltip="Delete the selected items" 
383          />
384          <tbl:button 
385            id="btnRestoreItems"
386            image="restore.png"
387            title="Restore" 
388            tooltip="Restore the selected (deleted) items"
389          />
390          <tbl:button 
391            id="btnShareItems"
392            image="share.png"
393            title="Share&hellip;" 
394            tooltip="Share the selected items"
395          />
396          <tbl:button 
397            id="btnSetOwner"
398            image="take_ownership.png"
399            title="Set owner&hellip;"
400            tooltip="Change owner of the selected items"
401          />
402          <tbl:button 
403            id="btnColumns"
404            image="columns.png" 
405            title="Columns&hellip;" 
406            tooltip="Show, hide and re-order columns" 
407          />
408          <tbl:button 
409            id="btnImport"
410            data-plugin-type="IMPORT"
411            image="import.png" 
412            title="Import&hellip;" 
413            tooltip="Import data" 
414            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
415          />
416          <tbl:button 
417            id="btnExport"
418            data-plugin-type="EXPORT"
419            image="export.png" 
420            title="Export&hellip;" 
421            tooltip="Export data" 
422            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
423          />
424          <tbl:button 
425            id="btnRunPlugin"
426            data-plugin-type="OTHER"
427            image="runplugin.png" 
428            title="Run plugin&hellip;" 
429            tooltip="Run a plugin" 
430            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
431          />
432          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
433            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
434        </tbl:toolbar>
435        <tbl:panel>
436          <tbl:presetselector />
437          <tbl:navigator
438            page="<%=cc.getPage()%>" 
439            rowsperpage="<%=cc.getRowsPerPage()%>" 
440            totalrows="<%=formulas == null ? 0 : formulas.getTotalCount()%>" 
441            visible="<%=mode.hasNavigator()%>"
442          />
443        </tbl:panel>
444      </div>
445      <tbl:data>
446        <tbl:headers>
447          <tbl:headerrow>
448            <tbl:header colspan="3" />
449            <tbl:columnheaders />
450          </tbl:headerrow>
451          <%
452          int numFilters = cc.getNumPropertyFilters();
453          int numRows = cc.getFilterRows();
454          for (int filterNo = 0; filterNo < numRows; filterNo++)
455          {
456            boolean lastRow = filterNo == numRows-1;
457            %>
458            <tbl:headerrow>
459              <tbl:header subclass="index" />
460              <tbl:header 
461                subclass="check" 
462                visible="<%=mode.hasCheck()%>"
463                ><base:icon 
464                  subclass="link table-check"
465                  image="check_uncheck.png" 
466                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
467                  visible="<%=lastRow%>"
468                /></tbl:header>
469              <tbl:header 
470                subclass="check" 
471                visible="<%=mode.hasRadio()%>"
472                />
473              <tbl:header 
474                subclass="icons" 
475                visible="<%=mode.hasIcons()%>"
476                >
477                <base:icon
478                  subclass="link table-filter-row-action"
479                  image="add.png"
480                  tooltip="Add extra filter row"
481                  visible="<%=lastRow%>"
482                /><base:icon
483                  subclass="link table-filter-row-action"
484                  image="remove.png"
485                  tooltip="Remove this filter row"
486                  visible="<%=numRows > 1 || numFilters > 0 %>"
487                  data-remove-row="<%=filterNo%>"
488                />
489              </tbl:header>
490              <tbl:propertyfilter row="<%=filterNo%>" />
491            </tbl:headerrow>
492            <%
493          }
494          %>
495          <tbl:columnsubtitles />
496        </tbl:headers>
497        <tbl:rows>
498          <%
499          if (cc.getMessage() != null)
500          {
501            %>
502            <tbl:panel subclass="bg-filled-50">
503              <div class="messagecontainer error"><%=cc.getMessage()%></div>
504            </tbl:panel>
505            <%
506            cc.setMessage(null);
507          }
508          int index = cc.getPage()*cc.getRowsPerPage();
509          int selectedItemId = cc.getId();
510          if (formulas != null)
511          {
512            while (formulas.hasNext())
513            {
514              Formula item = formulas.next();
515              RawDataType rawDataType = item.getRawDataType();
516              List<String> expressions = item.getFormulas();
517              int itemId = item.getId();
518             
519             
520              boolean deletePermission = item.hasPermission(Permission.DELETE);
521              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
522              boolean writePermission = item.hasPermission(Permission.WRITE);
523              String tooltip = mode.isSelectionMode() ?
524                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
525              String name = HTML.encodeTags(item.getName());
526              index++;
527              numListed++;
528              %>
529              <tbl:row>
530                <tbl:header 
531                  clazz="index"
532                  ><%=index%></tbl:header>
533                <tbl:header 
534                  clazz="check" 
535                  visible="<%=mode.hasCheck()%>"
536                  ><input 
537                    type="checkbox" 
538                    name="<%=itemId%>" 
539                    value="<%=itemId%>" 
540                    title="<%=name%>" 
541                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
542                  ></tbl:header>
543                <tbl:header 
544                  clazz="check" 
545                  visible="<%=mode.hasRadio()%>"
546                  ><input 
547                    type="radio" 
548                    name="item_id" 
549                    value="<%=itemId%>" 
550                    title="<%=name%>" 
551                    <%=selectedItemId == itemId ? "checked" : ""%>
552                  ></tbl:header>
553                <tbl:header 
554                  clazz="icons" 
555                  visible="<%=mode.hasIcons()%>"
556                  ><base:icon 
557                    image="deleted.png"
558                    id="<%="delete."+itemId %>"
559                    subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
560                    data-item-id="<%=itemId%>"
561                    tooltip="This item has been scheduled for deletion" 
562                    visible="<%=item.isRemoved()%>"
563                  /><base:icon 
564                    image="shared.png" 
565                    id="<%="share."+itemId %>"
566                    subclass="<%=sharePermission ? "table-share-item" : "disabled" %>"
567                    data-item-id="<%=itemId%>"
568                    tooltip="This item is shared to other users, groups and/or projects" 
569                    visible="<%=item.isShared()%>"
570                  />&nbsp;</tbl:header>
571                <tbl:cell column="name"><div
572                  class="link table-item"
573                  data-item-id="<%=itemId%>"
574                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
575                  tabindex="0"
576                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
577                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
578                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
579                <tbl:cell column="type"><%=item.getFormulaType().toString()%></tbl:cell>
580                <tbl:cell column="parser"><%=item.getParser().toString()%></tbl:cell>
581                <tbl:cell column="valueType"><%=item.getValueType() == null ? "<i>- unknown -</i>" : item.getValueType()%></tbl:cell>
582                <tbl:cell column="averageMethod"><%=item.getAverageMethod().toString()%></tbl:cell>
583                <tbl:cell column="sourceIntensityTransform"><%=item.getSourceIntensityTransform() == null ? "<i>- any -</i>" : item.getSourceIntensityTransform().toString()%></tbl:cell>
584                <tbl:cell column="resultIntensityTransform"><%=item.getResultIntensityTransform() == null ? "<i>- any -</i>" : item.getResultIntensityTransform().toString()%></tbl:cell>
585                <tbl:cell column="rawDataType"><%=rawDataType == null ? "<i>- none -</i>" : HTML.encodeTags(rawDataType.getName())%></tbl:cell>
586                <tbl:cell column="channels"><%=item.getChannels()%></tbl:cell>
587                <tbl:cell column="formulas">
588                <%
589                for (int i = 0; i < expressions.size(); ++i)
590                {
591                  %>
592                  <%=(i+1) + ": " + HTML.encodeTags(expressions.get(i))%><br>
593                  <%
594                }
595                %>
596                </tbl:cell>
597                <tbl:cell column="owner"
598                  ><base:propertyvalue 
599                    item="<%=item%>" 
600                    property="owner"
601                    enableEditLink="<%=mode.hasEditLink()%>" 
602                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
603                  /></tbl:cell>
604                <tbl:cell column="useColors"><%=item.getColoring().isUsingColors() ? "yes" : "no"%></tbl:cell>
605                <tbl:cell column="logarithmic"><%=item.getColoring().isLogarithmic() ? "yes" : "no"%></tbl:cell>
606                <tbl:cell column="minValue"><%=Values.formatNumber(item.getColoring().getMinValue(), 2)%></tbl:cell>
607                <tbl:cell column="midValue"><%=Values.formatNumber(item.getColoring().getMidValue(), 2)%></tbl:cell>
608                <tbl:cell column="maxValue"><%=Values.formatNumber(item.getColoring().getMaxValue(), 2)%></tbl:cell>
609                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
610                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
611                <tbl:cell column="sharedTo">
612                  <%
613                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
614                  while(sharees.hasNext())
615                  {
616                    Nameable n = sharees.next();
617                    if (mode.hasPropertyLink())
618                    {
619                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
620                    }
621                    else
622                    {
623                      out.write(HTML.encodeTags(n.getName()));
624                    }
625                    out.write(sharees.hasNext() ? ", " : "");
626                  }
627                  %>
628                </tbl:cell>
629                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
630                  <tbl:cell column="xt-columns" />
631                </tbl:xt-cells>
632              </tbl:row>
633              <%
634              }
635            }
636          if (numListed == 0)
637          {
638            %>
639            <tbl:panel subclass="bg-filled-50">
640              <div class="messagecontainer note">
641              <%=formulas == null || formulas.getTotalCount() == 0 ? "No formulas were found" : "No formulas on this page. Please select another page!" %>
642              </div>
643            </tbl:panel>
644            <%
645          }
646          %>
647        </tbl:rows>
648      </tbl:data>
649    </tbl:table>
650    </div>
651   
652    <base:buttongroup subclass="dialogbuttons">
653      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
654      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
655      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
656    </base:buttongroup>
657   
658  </base:body>
659  </base:page>
660  <%
661}
662finally
663{
664  if (formulas != null) formulas.close();
665  if (dc != null) dc.close();
666}
667%>
Note: See TracBrowser for help on using the repository browser.