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

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

References #1655: GUI improvements

  • Use relative font sizes (em and %) instead of pixel values. This should make it possible to use relative values for everything and we don't have to split up into size_*.css


  • Removed "valign" attribute from lots of tables.


  • Removed "wrap" attribute from lots of texarea fields.


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 12.9 KB
Line 
1<%-- $Id: jep_extra_value_calculator.jsp 5905 2011-12-12 08:42:09Z 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      if (frm.allBioAssays.checked)
238      {
239        return;
240      }
241      var ids = Link.getListIds(frm.bioAssays, 'R');
242      var excludes = ids.join(',');
243      var url = '../../views/experiments/bioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addBioAssayCallback&bioassayset_id=<%=source.getId()%>';
244      url += "&exclude="+excludes;
245      Main.openPopup(url, 'AddBioAssays', 1000, 700);
246    }
247    function addBioAssayCallback(bioAssayId, name)
248    {
249      var item = Link.getItem('R', bioAssayId);
250      if (!item) item = new Item('R', bioAssayId, name);
251      Link.addItem(document.forms['extraValue'].bioAssays, item);
252    }
253    function removeBioAssaysOnClick()
254    {
255      var frm = document.forms['extraValue'];
256      if (frm.allBioAssays.checked)
257      {
258        return;
259      }
260      Link.removeSelected(frm.bioAssays);
261    }
262    function init()
263    {
264      initBioAssays();
265    }
266   
267    function initBioAssays()
268    {
269      var frm = document.forms['extraValue'];
270      <%
271      if (bioAssays != null)
272      {
273        for (BioAssay ba : bioAssays)
274        {
275          %>
276          Link.addNewItem(frm.bioAssays, new Item('R', <%=ba.getId()%>, '<%=HTML.javaScriptEncode(ba.getName())%>'));
277          <%
278        }
279      }
280      %>
281      frm.allBioAssays.checked = frm.bioAssays.length == 0;
282      allBioAssaysOnClick();
283    }
284    </script>
285  </base:head>
286  <base:body onload="init()">
287    <form name="extraValue" action="index.jsp" method="post" onsubmit="return false;">
288    <input type="hidden" name="ID" value="<%=ID%>">
289    <input type="hidden" name="requestId" value="<%=request.getParameter("requestId")%>">
290    <input type="hidden" name="cmd" value="SetParameters">
291    <input type="hidden" name="parameter:source" value="<%=source.getId()%>">
292   
293    <h3 class="docked">Calculate extra value <base:help helpid="jepextravaluecalculator.options"/></h3>
294    <div class="boxed">
295   
296    <%
297    if (errorMessage != null || (errors != null && errors.size() > 0))
298    {
299      %>
300      <div id="errors" style="margin-bottom: 12px;" class="parameterhelp">
301        <div class="error" style="margin: 0px;">
302        <%=errorMessage %>
303        </div>
304        <%
305        if (errors != null && errors.size() > 0)
306        {
307          %>
308          <div id="showerrorlist" style="display: none;">
309            <base:icon image="bullet.gif" /><a href="javascript:showErrorList()">Show details</a>
310          </div>
311          <div id="errorlist">
312          <ol>
313          <%
314          for (Throwable t : errors)
315          {
316            %>
317            <li><%=t.getMessage()%><br>
318            <%
319          }
320          %>
321          </ol>
322          <base:icon image="bullet.gif" /><a href="javascript:hideErrorList()">Hide details</a>
323          </div>
324          <%
325        }
326        %>
327      </div>
328      <%
329    }
330    %>
331
332      <table class="form" width="100%">
333      <tr >
334        <td class="prompt">Source bioassay set</td>
335        <td><%=HTML.encodeTags(source.getName())%></td>
336      </tr>
337      <tr >
338      <td class="prompt">Bioassays</td>
339        <td>
340          <input type="checkbox" name="allBioAssays" id="allBioAssays"
341            onclick="allBioAssaysOnClick()"><label for="allBioAssays">All bioassays</label><br>
342          <table border="0" cellspacing="0" cellpadding="0">
343          <tr >
344          <td>
345            <select name="bioAssays" size="5" multiple style="width: 20em;">
346            </select>
347          </td>
348          <td>
349            <table border="0">
350            <tr><td width="150"><base:button 
351              onclick="addBioAssaysOnClick()" 
352              title="Add&nbsp;bioassays&hellip;" 
353              tooltip="Add bioassays"
354              /></td></tr>
355            <tr><td width="150"><base:button 
356              onclick="removeBioAssaysOnClick()" 
357              title="Remove" 
358              tooltip="Remove the selected bioassays"
359            /></td></tr>
360            </table>
361          </td>
362          </tr>
363          </table>
364        </td>
365      </tr>
366      <tr>
367        <td class="prompt">Extra value type</td>
368        <td>
369          <base:select 
370            id="parameter:extraValueType"
371            clazz="selectionlist"
372            required="true"
373            current="<%=currentExtraValueType%>"
374            recent="<%=recentExtraValueTypes%>"
375            newitem="true"
376            onselect="selectExtraValueTypeOnClick()"
377          />
378        </td>
379      </tr>
380     
381      <tr>
382        <td class="prompt">Expression</td>
383        <td>
384        <select name="presets" style="width: 32em;"
385          onchange="presetOnChange(this, this.form['parameter:expression'])" 
386          >
387          <option value="">- select from list or enter formula below -
388          <%=formulaOptions.toString()%>
389        </select>
390        </td>
391      </tr>
392     
393      <tr >
394        <td>&nbsp;</td>
395        <td>
396          <table border="0" cellspacing="0" cellpadding="0">
397          <tr >
398          <td>
399            <textarea class="text required" name="parameter:expression" 
400              rows="4" cols="50"><%=HTML.encodeTags(expression)%></textarea>&nbsp;
401          </td>
402          <td><base:button onclick="openExpressionBuilder()" 
403            title="Expression builder&hellip;" 
404            image="expression_builder.gif"
405            tooltip="A simple utility for building expressions" />
406          </td>
407          </tr>
408          </table>
409        </td>
410      </tr>
411      </table>
412    </div>
413    </form>
414 
415    <table align="center">
416    <tr>
417      <td width="50%"><base:button onclick="doNext();" title="Next" /></td>
418      <td width="50%"><base:button onclick="doCancel();" title="Cancel" /></td>
419    </tr>
420    </table>
421  </base:body>
422  </base:page>
423  <%
424}
425finally
426{
427  if (dc != null) dc.close();
428}%>
Note: See TracBrowser for help on using the repository browser.