source: trunk/www/admin/reporterclonetemplates/list_templates.jsp @ 5885

Last change on this file since 5885 was 5885, checked in by Nicklas Nordborg, 10 years ago

References #1616: Clone reporter information to per-experiment tables in the dynamic database

Updated Experiment explorer to use cloned information when possible. Renamed ClonedProperty to ClonableProperty.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 16.2 KB
Line 
1<%-- $Id $
2  ------------------------------------------------------------------
3  Copyright (C) 2011 Nicklas Nordborg
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22--%>
23<%@ page pageEncoding="UTF-8" session="false"
24  import="net.sf.basedb.core.SessionControl"
25  import="net.sf.basedb.core.DbControl"
26  import="net.sf.basedb.core.Item"
27  import="net.sf.basedb.core.ReporterCloneTemplate"
28  import="net.sf.basedb.core.ClonableProperty"
29  import="net.sf.basedb.core.ItemQuery"
30  import="net.sf.basedb.core.Include"
31  import="net.sf.basedb.core.ItemResultIterator"
32  import="net.sf.basedb.core.ItemResultList"
33  import="net.sf.basedb.core.ItemContext"
34  import="net.sf.basedb.core.Nameable"
35  import="net.sf.basedb.core.Permission"
36  import="net.sf.basedb.core.PluginDefinition"
37  import="net.sf.basedb.core.query.Orders"
38  import="net.sf.basedb.core.query.Hql"
39  import="net.sf.basedb.core.plugin.GuiContext"
40  import="net.sf.basedb.core.plugin.Plugin"
41  import="net.sf.basedb.util.Enumeration"
42  import="net.sf.basedb.util.ShareableUtil"
43  import="net.sf.basedb.clients.web.Base"
44  import="net.sf.basedb.clients.web.ModeInfo"
45  import="net.sf.basedb.clients.web.PermissionUtil"
46  import="net.sf.basedb.clients.web.util.HTML"
47  import="net.sf.basedb.util.Values"
48  import="net.sf.basedb.util.formatter.Formatter"
49  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
50  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
51  import="net.sf.basedb.clients.web.extensions.JspContext"
52  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
53  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
54  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
55  import="java.util.Date"
56  import="java.util.Iterator"
57  import="java.util.List"
58  import="java.util.Map"
59%>
60<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
61<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
62<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
63<%!
64  private static final Item itemType = Item.REPORTERCLONETEMPLATE;
65  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
66%>
67<%
68final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
69final String ID = sc.getId();
70final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
71final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
72
73final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
74final String callback = request.getParameter("callback");
75final String title = mode.generateTitle("reporter clone template", "reporter clone templates");
76final DbControl dc = sc.newDbControl();
77ItemResultIterator<ReporterCloneTemplate> templates = null;
78try
79{
80  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
81
82  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
83  try
84  {
85    final ItemQuery<ReporterCloneTemplate> query = Base.getConfiguredQuery(dc, cc, true, ReporterCloneTemplate.getQuery(), mode);
86    query.join(Hql.leftJoin("properties", "prp"));
87    query.setDistinct(true);
88    templates = query.iterate(dc);
89  }
90  catch (Throwable t)
91  {
92    cc.setMessage(t.getMessage());
93  }
94  int numListed = 0;
95  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
96  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
97  %>
98  <base:page title="<%=title==null ? "Reporter clone templates" : title%>" type="<%=mode.getPageType()%>">
99  <base:head scripts="menu.js,table.js" styles="menu.css,table.css">
100    <ext:scripts context="<%=jspContext%>" />
101    <ext:stylesheets context="<%=jspContext%>" />
102    <script language="JavaScript">
103    var submitPage = 'index.jsp';
104    var formId = 'templates';
105    function newItem()
106    {
107      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', 0, true);
108    }
109    function editItem(itemId)
110    {
111      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
112    }
113    function viewItem(itemId)
114    {
115      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
116    }
117    function itemOnClick(evt, itemId)
118    {
119      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
120    }
121    function deleteItems()
122    {
123      var frm = document.forms[formId];
124      if (Forms.numChecked(frm) == 0)
125      {
126        alert('Please select at least one item in the list');
127        return;
128      }
129      frm.action = submitPage;
130      frm.cmd.value = 'DeleteItems';
131      frm.submit();
132    }
133    function restoreItems()
134    {
135      var frm = document.forms[formId];
136      if (Forms.numChecked(frm) == 0)
137      {
138        alert('Please select at least one item in the list');
139        return;
140      }
141      frm.action = submitPage;
142      frm.cmd.value = 'RestoreItems';
143      frm.submit();
144    }
145    function deleteItemPermanently(itemId)
146    {
147      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', itemId);
148    }
149    function setOwner()
150    {
151      Table.setOwnerOfItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'SetOwnerOfItems');
152    }
153    function shareItem(itemId)
154    {
155      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id='+itemId, 'ShareReporterCloneTemplates', 600, 400);
156    }
157    function shareItems()
158    {
159      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems');
160    }
161    function configureColumns()
162    {
163      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
164    }
165    function runPlugin(cmd)
166    {
167      Table.submitToPopup(formId, cmd, 740, 540);
168    }
169    function returnSelected()
170    {
171      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
172      window.close();
173    }
174    function presetOnChange()
175    {
176      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
177    }
178    </script>
179  </base:head>
180 
181  <base:body>
182    <%
183    if (cc.getMessage() != null)
184    {
185      %>
186      <div class="error"><%=cc.getMessage()%></div>
187      <%
188      cc.setMessage(null);
189    }
190    %>
191    <tbl:table 
192      id="templates" 
193      clazz="itemlist" 
194      columns="<%=cc.getSetting("columns")%>"
195      sortby="<%=cc.getSortProperty()%>" 
196      direction="<%=cc.getSortDirection()%>"
197      title="<%=title%>"
198      action="index.jsp"
199      sc="<%=sc%>"
200      item="<%=itemType%>"
201      >
202      <tbl:hidden 
203        name="mode" 
204        value="<%=mode.getName()%>" 
205      />
206      <tbl:hidden 
207        name="callback" 
208        value="<%=callback%>" 
209        skip="<%=callback == null%>" 
210      />
211      <tbl:columndef 
212        id="name"
213        property="name"
214        datatype="string"
215        title="Name"
216        sortable="true" 
217        filterable="true"
218        exportable="true"
219        show="always" 
220      />
221      <tbl:columndef 
222        id="id"
223        clazz="uniquecol"
224        property="id"
225        datatype="int"
226        title="ID"
227        sortable="true"
228        filterable="true"
229        exportable="true"
230      />
231      <%
232      Enumeration<String, String> allProperties = new Enumeration<String, String>();
233      for (ClonableProperty cp : ClonableProperty.getAll())
234      {
235        allProperties.add(cp.getTitle(), cp.getTitle());
236      }
237      %>
238      <tbl:columndef 
239        id="properties"
240        property="$prp.title"
241        datatype="string"
242        title="Properties"
243        filterable="true"
244        enumeration="<%=allProperties %>"
245      />
246      <tbl:columndef 
247        id="entryDate"
248        property="entryDate"
249        datatype="date"
250        title="Registered"
251        sortable="true" 
252        filterable="true"
253        exportable="true"
254        formatter="<%=dateFormatter%>"
255      />
256      <tbl:columndef 
257        id="owner"
258        property="owner.name"
259        datatype="string"
260        title="Owner"
261        sortable="true" 
262        filterable="true"
263        exportable="true"
264      />
265      <tbl:columndef 
266        id="description"
267        property="description"
268        datatype="string"
269        title="Description" 
270        sortable="true" 
271        filterable="true" 
272        exportable="true"
273      />
274      <tbl:columndef
275        id="permission"
276        title="Permission"
277      />
278      <tbl:columndef
279        id="sharedTo"
280        title="Shared to"
281        filterable="true"
282        filterproperty="!sharedTo.name"
283        datatype="string"
284      />
285      <tbl:toolbar
286        visible="<%=mode.hasToolbar()%>"
287        >
288        <tbl:button 
289          disabled="<%=createPermission ? false : true%>" 
290          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
291          onclick="newItem()" 
292          title="New&hellip;" 
293          tooltip="<%=createPermission ? "Create new template" : "You do not have permission to create templates"%>" 
294        />
295        <tbl:button 
296          image="delete.gif"
297          onclick="deleteItems()" 
298          title="Delete" 
299          tooltip="Delete the selected items" 
300        />
301        <tbl:button 
302          image="restore.gif"
303          onclick="restoreItems()" 
304          title="Restore" 
305          tooltip="Restore the selected (deleted) items"
306        />
307        <tbl:button 
308          image="share.gif"
309          onclick="shareItems()" 
310          title="Share&hellip;" 
311          tooltip="Share the selected items"
312        />
313        <tbl:button 
314          image="take_ownership.png"
315          onclick="setOwner()" 
316          title="Set owner&hellip;"
317          tooltip="Change owner of the selected items"
318        />
319        <tbl:button 
320          image="columns.gif" 
321          onclick="configureColumns()" 
322          title="Columns&hellip;" 
323          tooltip="Show, hide and re-order columns" 
324        />
325        <tbl:button 
326          image="import.gif" 
327          onclick="runPlugin('ImportItems')" 
328          title="Import&hellip;" 
329          tooltip="Import data" 
330          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
331        />
332        <tbl:button 
333          image="export.gif" 
334          onclick="runPlugin('ExportItems')" 
335          title="Export&hellip;" 
336          tooltip="Export data" 
337          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
338        />
339        <tbl:button 
340          image="runplugin.gif" 
341          onclick="runPlugin('RunListPlugin')" 
342          title="Run plugin&hellip;" 
343          tooltip="Run a plugin" 
344          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
345        />
346        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
347          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
348      </tbl:toolbar>
349      <tbl:navigator
350        page="<%=cc.getPage()%>" 
351        rowsperpage="<%=cc.getRowsPerPage()%>" 
352        totalrows="<%=templates == null ? 0 : templates.getTotalCount()%>" 
353        visible="<%=mode.hasNavigator()%>"
354      />
355      <tbl:data>
356        <tbl:columns>
357        <tbl:presetselector 
358          clazz="columnheader"
359          colspan="3"
360          onchange="presetOnChange()"
361        />
362        </tbl:columns>
363
364        <tr>
365          <tbl:header 
366            clazz="index"
367            >&nbsp;</tbl:header>
368          <tbl:header 
369            clazz="check" 
370            visible="<%=mode.hasCheck()%>"
371            ><base:icon 
372              image="check_uncheck.gif" 
373              tooltip="Check/uncheck all" 
374              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
375            /></tbl:header>
376          <tbl:header 
377            clazz="check" 
378            visible="<%=mode.hasRadio()%>"
379            >&nbsp;</tbl:header>
380          <tbl:header 
381            clazz="icons" 
382            visible="<%=mode.hasIcons()%>"
383            >&nbsp;</tbl:header>
384          <tbl:propertyfilter />
385        </tr>
386         
387          <tbl:rows>
388          <%
389          int index = cc.getPage()*cc.getRowsPerPage();
390          int selectedItemId = Values.getInt(request.getParameter("item_id"));
391          if (templates != null)
392          {
393            while (templates.hasNext())
394            {
395              ReporterCloneTemplate item = templates.next();
396              int itemId = item.getId();
397              String openSharePopup = "shareItem("+itemId+")";
398              String deletePermanently = "deleteItemPermanently("+itemId+")";
399              boolean deletePermission = item.hasPermission(Permission.DELETE);
400              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
401              boolean writePermission = item.hasPermission(Permission.WRITE);
402              String name = HTML.encodeTags(item.getName());
403              String tooltip = mode.isSelectionMode() ? 
404                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
405              index++;
406              numListed++;
407              %>
408              <tbl:row>
409                <tbl:header 
410                  clazz="index"
411                  ><%=index%></tbl:header>
412                <tbl:header 
413                  clazz="check" 
414                  visible="<%=mode.hasCheck()%>"
415                  ><input 
416                    type="checkbox" 
417                    name="<%=itemId%>" 
418                    value="<%=itemId%>" 
419                    title="<%=name%>" 
420                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
421                  ></tbl:header>
422                <tbl:header 
423                  clazz="check" 
424                  visible="<%=mode.hasRadio()%>"
425                  ><input 
426                    type="radio" 
427                    name="item_id" 
428                    value="<%=itemId%>" 
429                    title="<%=name%>" 
430                    <%=selectedItemId == itemId ? "checked" : ""%>
431                  ></tbl:header>
432                <tbl:header 
433                  clazz="icons" 
434                  visible="<%=mode.hasIcons()%>"
435                  ><base:icon 
436                    image="<%=deletePermission ? "deleted.gif" : "deleted_disabled.gif"%>"
437                    onclick="<%=deletePermission ? deletePermanently : null%>"
438                    tooltip="This item has been scheduled for deletion" 
439                    visible="<%=item.isRemoved()%>"
440                  /><base:icon 
441                    image="<%=sharePermission ? "shared.gif" : "shared_disabled.gif"%>" 
442                    onclick="<%=sharePermission ? openSharePopup : null%>"
443                    tooltip="This item is shared to other users, groups and/or projects" 
444                    visible="<%=item.isShared()%>"
445                  />&nbsp;</tbl:header>
446                <tbl:cell column="name"><div class="link" 
447                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
448                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
449                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
450                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
451                <tbl:cell column="owner"
452                  ><base:propertyvalue 
453                    item="<%=item%>" 
454                    property="owner"
455                    enableEditLink="<%=mode.hasEditLink()%>" 
456                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
457                  /></tbl:cell>
458                <tbl:cell column="properties">
459                  <%
460                  String separator = "";
461                  for (ClonableProperty cp : item.getClonableProperties())
462                  {
463                    out.write(separator);
464                    separator = ", ";
465                    out.write(HTML.encodeTags(cp.getTitle()));
466                  }
467                  %>
468                </tbl:cell>
469                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
470                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
471                <tbl:cell column="sharedTo">
472                  <%
473                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
474                  while(sharees.hasNext())
475                  {
476                    Nameable n = sharees.next();
477                    if (mode.hasPropertyLink())
478                    {
479                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
480                    }
481                    else
482                    {
483                      out.write(HTML.encodeTags(n.getName()));
484                    }
485                    out.write(sharees.hasNext() ? ", " : "");
486                  }
487                  %>
488                </tbl:cell>
489              </tbl:row>
490              <%
491              }
492            }
493          %>
494          </tbl:rows>
495      </tbl:data>
496      <%
497      if (numListed == 0)
498      {
499        %>
500        <tbl:panel><%=templates == null || templates.getTotalCount() == 0 ? "No templates were found" : "No templates on this page. Please select another page!" %></tbl:panel>
501        <%
502      }
503      else
504      {
505        %>
506        <tbl:navigator
507          page="<%=cc.getPage()%>" 
508          rowsperpage="<%=cc.getRowsPerPage()%>" 
509          totalrows="<%=templates == null ? 0 : templates.getTotalCount()%>" 
510          visible="<%=mode.hasNavigator()%>"
511          locked="true"
512        />
513        <%
514      }
515      %>
516    </tbl:table>
517    <base:buttongroup align="center" clazz="fixedatbottom">
518      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
519      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
520      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
521    </base:buttongroup>
522    <br><br><br>
523  </base:body>
524  </base:page>
525  <%
526}
527finally
528{
529  if (templates != null) templates.close();
530  if (dc != null) dc.close();
531}
532%>
Note: See TracBrowser for help on using the repository browser.