source: trunk/www/views/experiments/edit_experiment.jsp @ 3888

Last change on this file since 3888 was 3888, checked in by Nicklas Nordborg, 15 years ago

References #707: Can't unlink items that have been put in the trashcan

Fixes the problem for all items in the View and Array LIMS menus.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.6 KB
Line 
1<%-- $Id: edit_experiment.jsp 3888 2007-10-29 13:00:56Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Hakkinen, 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 2
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 this program; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place - Suite 330,
22  Boston, MA  02111-1307, USA.
23  ------------------------------------------------------------------
24
25
26  @author Nicklas
27  @version 2.0
28--%>
29<%@ page session="false"
30  import="net.sf.basedb.core.SessionControl"
31  import="net.sf.basedb.core.DbControl"
32  import="net.sf.basedb.core.Item"
33  import="net.sf.basedb.core.ItemContext"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.Experiment"
36  import="net.sf.basedb.core.RawBioAssay"
37  import="net.sf.basedb.core.AnnotationType"
38  import="net.sf.basedb.core.RawDataType"
39  import="net.sf.basedb.core.RawDataTypes"
40  import="net.sf.basedb.core.Directory"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.ItemResultList"
43  import="net.sf.basedb.core.Include"
44  import="net.sf.basedb.core.Type"
45  import="net.sf.basedb.core.query.Restrictions"
46  import="net.sf.basedb.core.query.Expressions"
47  import="net.sf.basedb.core.query.Orders"
48  import="net.sf.basedb.core.query.Hql"
49  import="net.sf.basedb.core.PermissionDeniedException"
50  import="net.sf.basedb.core.BaseException"
51  import="net.sf.basedb.core.Project"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.WebException"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.util.Enumeration"
57  import="net.sf.basedb.util.formatter.Formatter"
58  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
59  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
60  import="java.util.Arrays"
61  import="java.util.Date"
62  import="java.util.List"
63%>
64<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
65<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
66<%
67final Item itemType = Item.EXPERIMENT;
68final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
69final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
70final int itemId = cc.getId();
71final String ID = sc.getId();
72final float scale = Base.getScale(sc);
73final DbControl dc = sc.newDbControl();
74try
75{
76  String title = null;
77  Experiment experiment = null;
78  RawDataType currentRawDataType = null;
79  RawDataType defaultRawDataType = null;
80  ItemQuery<RawBioAssay> rbaQuery = null;
81  ItemQuery<AnnotationType> efQuery = null;
82 
83  boolean readCurrentDirectory = true;
84  Directory currentDirectory = null;
85
86  List<Directory> recentDirectories = (List<Directory>)cc.getRecent(dc, Item.DIRECTORY);
87
88  int activeProjectId = sc.getActiveProjectId();
89  if (activeProjectId > 0)
90  {
91    Project activeProject = Project.getById(dc, activeProjectId);   
92    defaultRawDataType = activeProject.getDefaultRawDataType();
93  } 
94  if (itemId == 0)
95  {
96    title = "Create experiment";
97    currentRawDataType = RawDataTypes.getRawDataType(cc.getPropertyValue("rawDataType"));
98    if (currentRawDataType == null)
99    {
100      currentRawDataType = RawDataTypes.getRawDataType(cc.getRecent("RawDataType", 0));
101    }
102    if (cc.getPropertyFilter("directory.name") != null)
103    {
104      currentDirectory = Base.getFirstMatching(dc, Directory.getQuery(), "name", cc.getPropertyFilter("directory.name"));
105    }
106    cc.removeObject("item");
107    String[] selected = request.getParameterValues("rawbioassay_id");
108    if (selected != null)
109    {
110      rbaQuery = RawBioAssay.getQuery();
111      rbaQuery.restrict(Restrictions.in(Hql.property("id"), Expressions.parameter("selected")));
112      rbaQuery.setParameter("selected", Arrays.asList(Values.getInt(selected)), Type.INT);
113    }   
114  }
115  else
116  {
117    experiment = Experiment.getById(dc, itemId);
118    rbaQuery = experiment.getRawBioAssays();
119    efQuery = experiment.getExperimentalFactors();
120    cc.setObject("item", experiment);
121    currentRawDataType = experiment.getRawDataType();
122    title = "Edit experiment -- " + HTML.encodeTags(experiment.getName());
123    try
124    {
125      currentDirectory = experiment.getDirectory();
126    }
127    catch (PermissionDeniedException ex)
128    {
129      readCurrentDirectory = false;
130    }
131  }
132  if (experiment != null) experiment.checkPermission(Permission.WRITE);
133 
134  final String clazz = "class=\"text\"";
135  final String requiredClazz = "class=\"text required\"";
136  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
137  String dateFormat = FormatterSettings.getDateFormat(sc);
138  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
139  String htmlDateFormat = HTML.encodeTags(dateFormat);
140  %>
141
142  <base:page type="popup" title="<%=title%>">
143  <base:head scripts="tabcontrol.js,linkitems.js" styles="tabcontrol.css">
144    <script language="JavaScript">
145    // Validate the "Experiment" tab
146    function validateExperiment()
147    {
148      var frm = document.forms['experiment'];
149      if (Main.trimString(frm.name.value) == '')
150      {
151        alert("You must enter a name");
152        frm.name.focus();
153        return false;
154      }
155      if (frm.rawdatatype)
156      {
157        if (frm.rawdatatype[frm.rawdatatype.selectedIndex].value == '')
158        {
159          alert("You must select a raw data type");
160          frm.rawdatatype.focus();
161          return false;
162        }
163      }
164      return true;
165    }
166   
167    // Validate the "Experimental factors" tab
168    function validateExperimentalFactors()
169    {
170      return true;
171    }
172
173    // Submit the form
174    function saveSettings()
175    {
176      var frm = document.forms['experiment'];
177      if (TabControl.validateActiveTab('settings'))
178      {
179        frm.addedRawBioAssays.value = Link.getActionIds(1, 'R').join(',');
180        frm.removedRawBioAssays.value = Link.getActionIds(-1, 'R').join(',');
181
182        frm.addedAnnotationTypes.value = Link.getActionIds(1, 'A').join(',');
183        frm.removedAnnotationTypes.value = Link.getActionIds(-1, 'A').join(',');
184       
185        frm.submit();
186      }
187    }
188   
189    function addRawBioAssaysOnClick()
190    {
191      var frm = document.forms['experiment'];
192      var ids = Link.getListIds(frm.rawBioAssays, 'R');
193      var excludes = ids.join(',');
194      var rawDataType = <%=experiment == null ? "frm.rawdatatype[frm.rawdatatype.selectedIndex].value" : "'"+currentRawDataType.getId()+"'"%>;
195      var url = '../rawbioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addRawBioAssayCallback';
196      url += "&exclude="+excludes;
197      url += '&filter:STRING:rawDataType='+rawDataType;
198      Main.openPopup(url, 'AddRawBioAssays', 1000, 700);
199    }
200    function addRawBioAssayCallback(rawBioAssayId, name)
201    {
202      var item = Link.getItem('R', rawBioAssayId);
203      if (!item) item = new Item('R', rawBioAssayId, name);
204      Link.addItem(document.forms['experiment'].rawBioAssays, item);
205    }
206    function removeRawBioAssaysOnClick()
207    {
208      Link.removeSelected(document.forms['experiment'].rawBioAssays);
209    }
210   
211    function addAnnotationTypesOnClick()
212    {
213      var frm = document.forms['experiment'];
214      var ids = Link.getListIds(frm.annotationTypes, 'A');
215      var excludes = ids.join(',');
216      var url = '../../admin/annotationtypes/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addAnnotationTypeCallback';
217      url += "&exclude="+excludes;
218      Main.openPopup(url, 'AddAnnotationTypes', 1000, 700);
219    }
220    function addAnnotationTypeCallback(annotationTypeId, name)
221    {
222      var item = Link.getItem('A', annotationTypeId);
223      if (!item) item = new Item('A', annotationTypeId, name);
224      Link.addItem(document.forms['experiment'].annotationTypes, item);
225    }
226    function removeAnnotationTypesOnClick()
227    {
228      Link.removeSelected(document.forms['experiment'].annotationTypes);
229    }
230    function selectDirectoryOnClick()
231    {
232      var frm = document.forms['experiment'];
233      var url = '../../filemanager/directories/index.jsp?ID=<%=ID%>&mode=selectonedirectory&callback=setDirectoryCallback';
234      if (frm.directory_id.length > 1)
235      {
236        var id = Math.abs(parseInt(frm.directory_id[1].value));       
237        url += '&directory_id='+id;
238      }
239      Main.openPopup(url, 'SelectDirectory', 350, 500);
240    }
241    function setDirectoryCallback(id, name)
242    {
243      var frm = document.forms['experiment'];
244      var list = frm.directory_id;
245      if (list.length < 2 || list[1].value == '0') // >
246      {
247        Forms.addListOption(list, 1, new Option());
248      }
249      list[1].value = id;
250      list[1].text = name;
251      list.selectedIndex = 1;
252    }
253
254    function init()
255    {
256      var frm = document.forms['experiment'];
257      <%
258      if (experiment == null)
259      {
260        %>
261        frm.name.focus();
262        frm.name.select();
263        <%
264      }
265      if (rbaQuery != null)
266      {
267        %>
268        var rawBioAssays = frm.rawBioAssays;
269        <%
270        rbaQuery.include(Include.ALL);
271        rbaQuery.order(Orders.asc(Hql.property("name")));
272        ItemResultList<RawBioAssay> rawBioAssays = rbaQuery.list(dc);
273        for (RawBioAssay rba : rawBioAssays)
274        {
275          RawDataType rbaDataType = rba.getRawDataType();
276          if (currentRawDataType == null) 
277          {
278            currentRawDataType = rbaDataType;
279          }
280          String linkMethod = "addNewItem";
281          if (experiment == null)
282          {
283            linkMethod = "addItem";
284            // Checks for new experiment
285            if (rbaDataType != currentRawDataType)
286            {
287              throw new WebException("popup", "Raw data types doesn't match",
288                "The raw data type of the selected raw bioassays are not the same. " + 
289                "It is not possible to mix raw data types in an experiment.");
290            }
291          }
292          %>
293          Link.<%=linkMethod%>(rawBioAssays, new Item('R', <%=rba.getId()%>, '<%=HTML.javaScriptEncode(rba.getName())%>'));
294          <%
295        }
296      }
297      if (efQuery != null)
298      {
299        %>
300        var annotationTypes = frm.annotationTypes;
301        <%
302        efQuery.include(Include.ALL);
303        efQuery.order(Orders.asc(Hql.property("name")));
304        ItemResultList<AnnotationType> experimentalFactors = efQuery.list(dc);
305        for (AnnotationType at : experimentalFactors)
306        {
307          %>
308          Link.addNewItem(annotationTypes, new Item('A', <%=at.getId()%>, '<%=HTML.javaScriptEncode(at.getName())%>'));
309          <%
310        }
311      }
312      %>
313    }
314    </script>
315  </base:head>
316  <base:body onload="init()">
317    <p>
318    <form action="index.jsp?ID=<%=ID%>" method="post" name="experiment" onsubmit="return false;">
319    <input type="hidden" name="cmd" value="UpdateItem">
320
321    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
322    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*370)+"px;"%>" 
323      position="bottom" remember="<%=experiment != null%>">
324    <t:tab id="info" title="Experiment" validate="validateExperiment()" helpid="experiment.edit">
325      <table class="form" cellspacing=0>
326      <tr>
327        <td class="prompt">Name</td>
328        <td><input <%=requiredClazz%> type="text" name="name" 
329          value="<%=HTML.encodeTags(experiment == null ? Values.getString(cc.getPropertyValue("name"), "New experiment") : experiment.getName())%>" 
330          size="40" maxlength="<%=Experiment.MAX_NAME_LENGTH%>"></td>
331      </tr>
332     
333      <tr>
334        <td class="prompt">Raw data type</td>
335        <td>
336          <%
337          if (experiment == null)
338          {
339            currentRawDataType = currentRawDataType != null ? 
340              currentRawDataType : defaultRawDataType;
341            Enumeration<RawDataType, String> rawEnumeration = 
342              new Enumeration<RawDataType, String>();
343            for (RawDataType rdt : RawDataTypes.getRawDataTypes())
344            {
345              rawEnumeration.add(rdt, rdt.getName());
346            }
347            rawEnumeration.sortValues();           
348            %>
349            <select name="rawdatatype" class="required unchangeable">
350            <%
351            for (int i = 0; i < rawEnumeration.size(); ++i)
352            {
353              RawDataType rdt = rawEnumeration.getKey(i);
354              String selected = rdt.equals(currentRawDataType) ? "selected" : "";
355              %>
356              <option value="<%=rdt.getId()%>" <%=selected%>><%=HTML.encodeTags(rdt.getName())%>
357              <%
358            }
359            %>
360            </select>
361            <%
362          }
363          else
364          {
365            %>
366            <%=HTML.encodeTags(currentRawDataType.getName())%>
367            <%
368          }
369          %>
370       
371        </td>
372      </tr>
373      <tr>
374        <td class="prompt">Directory</td>
375        <td>
376          <base:select 
377            id="directory_id"
378            clazz="selectionlist"
379            required="false"
380            current="<%=currentDirectory%>"
381            denied="<%=!readCurrentDirectory%>"
382            recent="<%=recentDirectories%>"
383            newitem="<%=experiment == null%>"
384            onselect="selectDirectoryOnClick()"
385          />
386        </td>
387      </tr>
388      <tr valign="top">
389        <td class="prompt">Raw bioassays</td>
390        <td>
391          <table border="0" cellspacing="0" cellpadding="0">
392          <tr valign="top">
393          <td>
394            <select name="rawBioAssays" size="5" multiple style="width: 20em;">
395            </select>
396            <input type="hidden" name="addedRawBioAssays" value="">
397            <input type="hidden" name="removedRawBioAssays" value="">
398          </td>
399          <td>
400            <table border="0">
401            <tr><td width="150"><base:button 
402              onclick="addRawBioAssaysOnClick()" 
403              title="Add&nbsp;raw bioassays&hellip;" 
404              tooltip="Add raw bioassays"
405              /></td></tr>
406            <tr><td width="150"><base:button 
407              onclick="removeRawBioAssaysOnClick()" 
408              title="Remove" 
409              tooltip="Remove the selected raw bioassays"
410            /></td></tr>
411            </table>
412          </td>
413          </tr>
414          </table>
415        </td>
416      </tr>
417      <tr valign=top>
418        <td class="prompt">Description</td>
419        <td nowrap>
420          <textarea <%=clazz%> rows="4" cols="40" name="description" wrap="virtual"
421            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("description") : experiment.getDescription())%></textarea>
422          <a href="javascript:Main.zoom('Description', 'rawbioassay', 'description')"
423            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
424        </td>
425      </tr>
426      </table>
427      <div align=right>
428        &nbsp;<i><base:icon image="required.gif" /> = required information</i>
429        <%if (experiment == null) {%><br>
430        <i><base:icon image="unchangeable.gif" /> = can't be changed later</i>
431        <%}%>
432        </div>
433    </t:tab>
434   
435    <t:tab id="publication" title="Publication"  helpid="experiment.edit.publication">
436      <table class="form" cellspacing=0>
437      <tr>
438        <td class="prompt">PubMedId</td>
439        <td><input <%=clazz%> type="text" name="pubMedId" 
440          value="<%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("pubMedId") : experiment.getPubMedId())%>" 
441          size="40" maxlength="<%=Experiment.MAX_PUBMEDID_LENGTH%>"></td>
442      </tr>
443        <td class="prompt">Title</td>
444        <td nowrap>
445          <textarea <%=clazz%> rows="4" cols="40" name="title" wrap="virtual"
446            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("title") : experiment.getTitle())%></textarea>
447          <a href="javascript:Main.zoom('Title', 'experiment', 'title')"
448            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
449        </td>
450      </tr>
451      <tr>
452        <td class="prompt">Publication date</td>
453        <td>
454          <table border="0" cellspacing="0" cellpadding="0">
455          <tr>
456          <td>
457            <input <%=clazz%> type="text" name="publicationDate" 
458              value="<%=HTML.encodeTags(dateFormatter.format(experiment == null ? 
459                (Date)cc.getPropertyObject("publicationDate") : experiment.getPublicationDate()))%>" 
460              size="20" maxlength="20" title="Enter date in format: <%=htmlDateFormat%>">
461            &nbsp;
462          </td>
463          <td>
464          <base:button 
465            onclick="<%="Dates.selectDate('Publication date', 'experiment', 'publicationDate', null, '"+jsDateFormat+"')"%>"
466            image="calendar.png"
467            title="Calendar&hellip;" 
468            tooltip="Select a date from a calendar" 
469          />
470          </td>
471          </tr>
472          </table>
473        </td>
474      </tr>
475      <tr valign=top>
476        <td class="prompt">Abstract</td>
477        <td nowrap>
478          <textarea <%=clazz%> rows="4" cols="40" name="abstract" wrap="virtual"
479            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("abstract") : experiment.getAbstract())%></textarea>
480          <a href="javascript:Main.zoom('Abstract', 'experiment', 'abstract')"
481            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
482        </td>
483      </tr>
484      <tr valign=top>
485        <td class="prompt">Experiment design</td>
486        <td nowrap>
487          <textarea <%=clazz%> rows="4" cols="40" name="experimentDesign" wrap="virtual"
488            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("experimentDesign") : experiment.getExperimentDesign())%></textarea>
489          <a href="javascript:Main.zoom('Experiment design', 'experiment', 'experimentDesign')"
490            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
491        </td>
492      </tr>
493      <tr valign=top>
494        <td class="prompt">Experiment type</td>
495        <td nowrap>
496          <textarea <%=clazz%> rows="4" cols="40" name="experimentType" wrap="virtual"
497            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("experimentType") : experiment.getExperimentType())%></textarea>
498          <a href="javascript:Main.zoom('Experiment type', 'experiment', 'experimentType')"
499            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
500        </td>
501      </tr>
502      <tr valign=top>
503        <td class="prompt">Affiliations</td>
504        <td nowrap>
505          <textarea <%=clazz%> rows="4" cols="40" name="affiliations" wrap="virtual"
506            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("affiliations") : experiment.getAffiliations())%></textarea>
507          <a href="javascript:Main.zoom('Affiliations', 'experiment', 'affiliations')"
508            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
509        </td>
510      </tr>
511      <tr valign=top>
512        <td class="prompt">Authors</td>
513        <td nowrap>
514          <textarea <%=clazz%> rows="4" cols="40" name="authors" wrap="virtual"
515            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("authors") : experiment.getAuthors())%></textarea>
516          <a href="javascript:Main.zoom('Authors', 'experiment', 'authors')"
517            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
518        </td>
519      </tr>
520      <tr valign=top>
521        <td class="prompt">Publication</td>
522        <td nowrap>
523          <textarea <%=clazz%> rows="4" cols="40" name="publication" wrap="virtual"
524            ><%=HTML.encodeTags(experiment == null ? cc.getPropertyValue("publication") : experiment.getPublication())%></textarea>
525          <a href="javascript:Main.zoom('Publication', 'experiment', 'publication')"
526            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
527        </td>
528      </tr>
529      </table>
530      </t:tab>
531     
532      <t:tab id="experimentalFactors" title="Experimental factors" 
533        validate="validateExperimentalFactors()" helpid="experiment.edit.factors">
534      <table class="form" cellspacing=0>
535
536      <tr valign="top">
537        <td class="prompt">Annotation types</td>
538        <td>
539          <table border="0" cellspacing="0" cellpadding="0">
540          <tr valign="top">
541          <td>
542            <select name="annotationTypes" size="10" multiple style="width: 20em;">
543            </select>
544            <input type="hidden" name="addedAnnotationTypes" value="">
545            <input type="hidden" name="removedAnnotationTypes" value="">
546          </td>
547          <td>
548            <table border="0">
549            <tr><td width="150"><base:button 
550              onclick="addAnnotationTypesOnClick()" 
551              title="Add annotation types&hellip;" 
552              tooltip="Add annotation types"
553              /></td></tr>
554            <tr><td width="150"><base:button 
555              onclick="removeAnnotationTypesOnClick()" 
556              title="Remove" 
557              tooltip="Remove the selected annotation types"
558            /></td></tr>
559            </table>
560          </td>
561          </tr>
562          </table>
563        </td>
564      </tr>
565      </table>
566      </t:tab>
567
568    </t:tabcontrol>
569
570    <table align="center">
571    <tr>
572      <td width="50%"><base:button onclick="saveSettings()" title="Save" /></td>
573      <td width="50%"><base:button onclick="window.close()" title="Cancel" /></td>
574    </tr>
575    </table>
576    </form>
577  </base:body>
578  </base:page>
579  <%
580}
581finally
582{
583  if (dc != null) dc.close();
584}
585%>
Note: See TracBrowser for help on using the repository browser.