source: trunk/www/plugins/net/sf/basedb/plugins/jep_extra_value_calculator.jsp @ 5923

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

References #1655: GUI improvements

  • Edit dialogs for bioassay set, bioassay, transformation and some other experiment related dialogs
  • Analysis plug-in that have special jsp forms
  • Change history
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.2 KB
Line 
1<%-- $Id: jep_extra_value_calculator.jsp 5923 2012-01-11 14:29:26Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Nicklas Nordborg
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.BioAssay"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.ItemContext"
32  import="net.sf.basedb.core.RawDataType"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.Formula"
35  import="net.sf.basedb.core.Job"
36  import="net.sf.basedb.core.ExtraValueType"
37  import="net.sf.basedb.core.ItemQuery"
38  import="net.sf.basedb.core.ItemResultList"
39  import="net.sf.basedb.core.Include"
40  import="net.sf.basedb.core.Type"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Restrictions"
43  import="net.sf.basedb.core.query.Expressions" 
44  import="net.sf.basedb.core.query.Hql"
45  import="net.sf.basedb.clients.web.Base"
46  import="net.sf.basedb.clients.web.WebException"
47  import="net.sf.basedb.clients.web.util.HTML"
48  import="net.sf.basedb.util.Values"
49  import="java.util.List"
50%>
51<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
52<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
53<%!
54private static void addFormulaOption(StringBuilder options, String formula, String title, String description)
55{
56  options.append("<option value=\"").append(HTML.encodeTags(formula)).append("\"");
57  options.append(" title=\"").append(HTML.encodeTags(description)).append("\"");
58  options.append(">").append(HTML.encodeTags(title)).append("\n");
59}
60%>
61<%
62final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
63final String ID = sc.getId();
64ItemContext cc = sc.getCurrentContext(Item.BIOASSAYSET);
65ItemContext realContext = (ItemContext)sc.getSessionSetting("plugin.configure.currentContext");
66if (realContext == null) realContext = cc;
67DbControl dc = null;
68try
69{
70  String errorMessage = (String)sc.getSessionSetting("plugin.configure.errors.message");
71  List<Throwable> errors = (List<Throwable>)sc.getSessionSetting("plugin.configure.errors.list");
72 
73  dc = sc.newDbControl();
74  Job job = (Job)sc.getSessionSetting("plugin.configure.job");
75  dc.reattachItem(job, false);
76  BioAssaySet source = null;
77  if (job != null) source = (BioAssaySet)job.getParameterValue("source");
78  if (source == null && cc.getId() != 0) source = BioAssaySet.getById(dc, cc.getId());
79  if (source == null) throw new WebException("popup", "No current bioassay set", 
80    "Could not find any current bioassay set. Please select a bioassay set before trying again");
81  source = BioAssaySet.getById(dc, source.getId());
82  int maxRawMappings = source.getMaxRawMappingsForSpot();
83
84  RawDataType rdt = source.getRawDataType();
85 
86  //Find selected bioassays
87  List<BioAssay> bioAssays = null;
88  if (job != null) bioAssays = (List<BioAssay>)job.getParameterValues("bioAssays");
89  if (bioAssays == null)
90  {
91    ItemContext bioAssayContext = sc.getCurrentContext(Item.BIOASSAY);
92    ItemQuery<BioAssay> bioAssayQuery = null;
93    if (bioAssayContext.getSelected().size() > 0)
94    {
95      bioAssayQuery = source.getBioAssays();
96      bioAssayQuery.restrict(
97        Restrictions.in(Hql.property("id"), Expressions.parameter("selected"))
98      );
99      bioAssayQuery.setParameter("selected", bioAssayContext.getSelected(), Type.INT);
100      bioAssays = bioAssayQuery.list(dc);
101    }
102  }
103 
104  // Current parameter values
105  ExtraValueType currentExtraValueType = (ExtraValueType)job.getParameterValue("extraValueType");
106  String expression = (String)job.getParameterValue("expression");
107 
108 
109  // Predefined formulas
110  ItemQuery<Formula> formulaQuery = Formula.getQuery(Formula.Type.COLUMN_EXPRESSION, rdt, 
111      source.getIntensityTransform());
112  formulaQuery.order(Orders.asc(Hql.property("name")));
113  formulaQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
114  ItemResultList<Formula> formulas = formulaQuery.list(dc);
115  StringBuilder formulaOptions = new StringBuilder();
116  for (Formula f : formulas)
117  {
118    String formula = f.getFormula(0);
119    if (maxRawMappings == 1 || !formula.contains("raw("))
120    {
121      addFormulaOption(formulaOptions, formula, f.getName(), f.getDescription());
122    }
123  }
124 
125  // Load recently used items
126  List<ExtraValueType> recentExtraValueTypes = (List<ExtraValueType>)realContext.getRecent(dc, Item.EXTRAVALUETYPE);
127  %>
128  <base:page type="popup" title="Calculate extra value">
129  <base:head scripts="linkitems.js" styles="parameters.css">
130    <script language="JavaScript">
131    function hideErrorList()
132    {
133      Main.hide('errorlist');
134      Main.show('showerrorlist');
135    }
136    function showErrorList()
137    {
138      Main.show('errorlist');
139      Main.hide('showerrorlist');
140    }
141    function selectExtraValueTypeOnClick()
142    {
143      var frm = document.forms['extraValue'];
144      var url = '../../admin/extravaluetypes/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setExtraValueTypeCallback';
145      if (frm['parameter:extraValueType'].length > 1)
146      {
147        var id = Math.abs(parseInt(frm['parameter:extraValueType'][1].value));
148        url += '&item_id='+id;
149      }
150      Main.openPopup(url, 'SelectExtraValueType', 1000, 700);
151    }
152    function setExtraValueTypeCallback(id, name)
153    {
154      var frm = document.forms['extraValue'];
155      var list = frm['parameter:extraValueType'];
156      if (list.length < 1 || list[0].value == '0') // >
157      {
158        Forms.addListOption(list, 0, new Option());
159      }
160      list[0].value = id;
161      list[0].text = name;
162      list.selectedIndex = 0;
163    }
164   
165    function presetOnChange(list, formula, label)
166    {
167      var index = list.selectedIndex;
168      formula.value = list[index].value;
169      if (list[index].value != '' && label) label.value = list[index].text;
170    }
171    function openExpressionBuilder()
172    {
173      Main.expressionBuilder('<%=ID%>', 'Expression', 'extraValue', 'parameter:expression', 'COLUMN_EXPRESSION', '<%=rdt.getId()%>', <%=rdt.getChannels()%>, false, <%=source.getId()%>);
174    }
175    function validate()
176    {
177      var frm = document.forms['extraValue'];
178      if (!frm.allBioAssays.checked && frm.bioAssays.length == 0)
179      {
180        alert('You have not selected any bioassays');
181        return false;
182      }
183      else if (frm['parameter:extraValueType'].selectedIndex < 0)
184      {
185        alert('You must select a type');
186        return false;
187      }
188      else if (Main.trimString(frm['parameter:expression'].value) == '')
189      {
190        alert('You must enter an expression for the extra value');
191        frm['parameter:expression'].focus();
192        return false;
193      }
194      <%
195      if (maxRawMappings != 1)
196      {
197        %>
198        else if (frm['parameter:expression'].value.search(/raw\(/) != -1)
199        {
200          alert('Can\'t use function raw() for bioassaysets with multiple mappings to raw data');
201          frm['parameter:expression'].focus();
202          return false;
203        }
204        <%
205      }
206      %>
207      return true;
208    }
209    function doNext()
210    {
211      if (validate())
212      {
213        var frm = document.forms['extraValue'];
214        if (!frm.allBioAssays.checked)
215        {
216          var ids = Link.getListIds(frm.bioAssays, 'R');
217          for (var i = 0; i < ids.length; i++)
218          {
219            Forms.createHidden(frm, 'parameter:bioAssays', ids[i]);
220          }
221        }
222        frm.submit();
223      }
224    }   
225    function doCancel()
226    {
227      location = 'index.jsp?ID=<%=ID%>&cmd=CancelWizard';
228    }
229    function allBioAssaysOnClick()
230    {
231      var frm = document.forms['extraValue'];
232      frm.bioAssays.disabled = frm.allBioAssays.checked;
233    }
234    function addBioAssaysOnClick()
235    {
236      var frm = document.forms['extraValue'];
237      frm.allBioAssays.checked = false;
238      frm.bioAssays.disabled = false;
239      var ids = Link.getListIds(frm.bioAssays, 'R');
240      var excludes = ids.join(',');
241      var url = '../../views/experiments/bioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addBioAssayCallback&bioassayset_id=<%=source.getId()%>';
242      url += "&exclude="+excludes;
243      Main.openPopup(url, 'AddBioAssays', 1000, 700);
244    }
245    function addBioAssayCallback(bioAssayId, name)
246    {
247      var item = Link.getItem('R', bioAssayId);
248      if (!item) item = new Item('R', bioAssayId, name);
249      Link.addItem(document.forms['extraValue'].bioAssays, item);
250    }
251    function removeBioAssaysOnClick()
252    {
253      var frm = document.forms['extraValue'];
254      if (frm.allBioAssays.checked)
255      {
256        return;
257      }
258      Link.removeSelected(frm.bioAssays);
259    }
260    function init()
261    {
262      initBioAssays();
263    }
264   
265    function initBioAssays()
266    {
267      var frm = document.forms['extraValue'];
268      <%
269      if (bioAssays != null)
270      {
271        for (BioAssay ba : bioAssays)
272        {
273          %>
274          Link.addNewItem(frm.bioAssays, new Item('R', <%=ba.getId()%>, '<%=HTML.javaScriptEncode(ba.getName())%>'));
275          <%
276        }
277      }
278      %>
279      frm.allBioAssays.checked = frm.bioAssays.length == 0;
280      allBioAssaysOnClick();
281    }
282    </script>
283  </base:head>
284  <base:body onload="init()">
285    <h1>Calculate extra value <base:help helpid="jepextravaluecalculator.options"/></h1>
286    <form name="extraValue" action="index.jsp" method="post" onsubmit="return false;">
287    <input type="hidden" name="ID" value="<%=ID%>">
288    <input type="hidden" name="requestId" value="<%=request.getParameter("requestId")%>">
289    <input type="hidden" name="cmd" value="SetParameters">
290    <input type="hidden" name="parameter:source" value="<%=source.getId()%>">
291   
292    <div class="content bottomborder">
293      <table class="fullform input100">
294      <%
295      if (errorMessage != null || (errors != null && errors.size() > 0))
296      {
297        %>
298        <tr>
299          <th></th>
300          <td colspan="2">
301          <div id="errors" style="margin-bottom: 12px;">
302            <div class="messagecontainer error" style="margin: 0px;">
303            <%=errorMessage %>
304            <%
305            if (errors != null && errors.size() > 0)
306            {
307              %>
308              <div id="showerrorlist">
309                <base:icon image="gonext.png" 
310                  onclick="showErrorList()" 
311                  style="color: #FFFFFF;"
312                  tooltip="Show more information about the error"
313                />
314              </div>
315              <div id="errorlist" style="display: none; margin: 0px;">
316                <base:icon image="move_down.png" 
317                  onclick="hideErrorList()" 
318                  style="color: #FFFFFF;" 
319                  tooltip="Show less information"
320                />
321                <ol>
322                <%
323                for (Throwable t : errors)
324                {
325                  %>
326                  <li><%=t.getMessage()%>
327                  <%
328                }
329                %>
330                </ol>
331              </div>
332              <%
333            }
334            %>
335          </div>
336          </td>
337        </tr>
338        <%
339      }
340      %>
341      <tr>
342        <th>Source</th>
343        <td><%=HTML.encodeTags(source.getName())%></td>
344        <td></td>
345      </tr>
346      <tr class="big">
347        <th class="subprompt">Bioassays</th>
348        <td>
349          <input type="checkbox" name="allBioAssays" id="allBioAssays"
350            onclick="allBioAssaysOnClick()"><label for="allBioAssays">All bioassays</label><br>
351          <div class="selectionlist">
352            <table>
353            <tr>
354            <td>
355              <select name="bioAssays" size="5" multiple>
356              </select>
357            </td>
358            <td style="vertical-align: top;">
359              <base:buttongroup vertical="true">
360                <base:button 
361                  subclass="leftaligned"
362                  onclick="addBioAssaysOnClick()" 
363                  title="Add bioassays&hellip;" 
364                  tooltip="Add bioassays"
365                />
366                <base:button 
367                  subclass="leftaligned"
368                  onclick="removeBioAssaysOnClick()" 
369                  title="Remove" 
370                  tooltip="Remove the selected bioassays"
371                />
372              </base:buttongroup>
373            </td>
374            </tr>
375            </table>
376          </div>
377        </td>
378        <td></td>
379      </tr>
380      <tr>
381        <th>Extra value type</th>
382        <td>
383          <base:select 
384            id="parameter:extraValueType"
385            clazz="selectionlist"
386            required="true"
387            current="<%=currentExtraValueType%>"
388            recent="<%=recentExtraValueTypes%>"
389            newitem="true"
390            onselect="selectExtraValueTypeOnClick()"
391          />
392        </td>
393        <td></td>
394      </tr>
395     
396      <tr>
397        <th>Expression</th>
398        <td>
399          <select name="presets" style="width: 30em;"
400            onchange="presetOnChange(this, this.form['parameter:expression'])" 
401            >
402            <option value="">- select from list or enter formula below -
403            <%=formulaOptions.toString()%>
404          </select>
405        </td>
406        <td></td>
407      </tr>
408     
409      <tr class="big">
410        <th class="subprompt"></th>
411        <td>
412          <textarea class="text required" name="parameter:expression" 
413              rows="3" ><%=HTML.encodeTags(expression)%></textarea>
414        </td>
415        <td style="width: 20px;">
416          <base:icon onclick="openExpressionBuilder()" 
417            image="expression_builder.gif"
418            tooltip="A simple utility for building expressions"
419          />
420        </td>
421      </tr>
422      <tr class="dynamic">
423        <th></th>
424        <td colspan="2"></td>
425      </tr>
426      </table>
427    </div>
428    </form>
429 
430    <base:buttongroup subclass="dialogbuttons">
431      <base:button onclick="doNext();" title="Next" />
432      <base:button onclick="doCancel();" title="Cancel" />
433    </base:buttongroup>
434 
435  </base:body>
436  </base:page>
437  <%
438}
439finally
440{
441  if (dc != null) dc.close();
442}%>
Note: See TracBrowser for help on using the repository browser.