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

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

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

Added a reporter cloning plug-in and buttons in the gui for starting it and for removing the cloned table. The gui probaby need some improvements and it should be possible to get more information about the cloned reporters...

Added permission checks in the ReporterCloneBatcher.

  • 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 import="net.sf.basedb.core.ClonedProperty"%>
24<%@ page pageEncoding="UTF-8" session="false"
25  import="net.sf.basedb.core.SessionControl"
26  import="net.sf.basedb.core.DbControl"
27  import="net.sf.basedb.core.Item"
28  import="net.sf.basedb.core.ReporterCloneTemplate"
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 (ClonedProperty cp : ClonedProperty.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 (ClonedProperty cp : item.getClonedProperties())
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.