source: trunk/www/plugins/net/sf/basedb/plugins/jep_filter.jsp @ 5908

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

References #1655: GUI improvements

  • File manager dialogs
  • File server edit dialog
  • Changed zoom.gif to png
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 14.1 KB
Line 
1<%-- $Id: jep_filter.jsp 5908 2011-12-13 13:48:46Z nicklas $
2  ------------------------------------------------------------------
3  BioArray Software Environment (BASE) - http:// base.thep.lu.se/
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  @author Nicklas
23  @version 2.0
24--%>
25<%@ page pageEncoding="UTF-8" session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Job"
29  import="net.sf.basedb.core.BioAssaySet"
30  import="net.sf.basedb.core.BioAssay"
31  import="net.sf.basedb.core.RawDataType"
32  import="net.sf.basedb.core.RawDataProperty"
33  import="net.sf.basedb.core.Experiment"
34  import="net.sf.basedb.core.Formula"
35  import="net.sf.basedb.core.Type"
36  import="net.sf.basedb.core.Item"
37  import="net.sf.basedb.core.ItemContext"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultList"
40  import="net.sf.basedb.core.Include"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.core.query.Restrictions"
44  import="net.sf.basedb.core.query.Expressions"
45  import="net.sf.basedb.clients.web.Base"
46  import="net.sf.basedb.clients.web.util.HTML"
47  import="net.sf.basedb.util.Values"
48  import="net.sf.basedb.clients.web.WebException"
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);
65DbControl dc = null;
66
67try
68{
69  String errorMessage = (String)sc.getSessionSetting("plugin.configure.errors.message");
70  List<Throwable> errors = (List<Throwable>)sc.getSessionSetting("plugin.configure.errors.list");
71 
72  dc = sc.newDbControl();
73  Job job = (Job)sc.getSessionSetting("plugin.configure.job");
74  dc.reattachItem(job, false);
75  BioAssaySet source = null;
76  source = (BioAssaySet)job.getParameterValue("source");
77  if (source == null && cc.getId() != 0) source = BioAssaySet.getById(dc, cc.getId());
78  if (source == null) throw new WebException("popup", "No current bioassay set", 
79    "Could not find any current bioassay set. Please select a bioassay set before trying again");
80  source = BioAssaySet.getById(dc, source.getId());
81  RawDataType rdt = source.getRawDataType();
82  long numBioAssays = source.getBioAssays().count(dc);
83  int maxRawMappings = source.getMaxRawMappingsForSpot();
84 
85  // Find selected bioassays
86  List<BioAssay> bioAssays = null;
87  bioAssays = (List<BioAssay>)job.getParameterValues("bioAssays");
88  if (bioAssays == null)
89  {
90    ItemContext bioAssayContext = sc.getCurrentContext(Item.BIOASSAY);
91    ItemQuery<BioAssay> bioAssayQuery = null;
92    if (bioAssayContext.getSelected().size() > 0)
93    {
94      bioAssayQuery = source.getBioAssays();
95      bioAssayQuery.restrict(
96        Restrictions.in(Hql.property("id"), Expressions.parameter("selected"))
97      );
98      bioAssayQuery.setParameter("selected", bioAssayContext.getSelected(), Type.INT);
99      bioAssays = bioAssayQuery.list(dc);
100    }
101  }
102 
103  // Current parameter values
104  String childName = Values.getString((String)job.getParameterValue("childName"), 
105    source.getName().startsWith("Filtered") ? "" : "Filtered " + source.getName());
106  String childDescription = (String)job.getParameterValue("childDescription");
107  String expression = (String)job.getParameterValue("expression");
108  Integer includeLimit = (Integer)job.getParameterValue("includeLimit");
109  Integer excludeLimit = (Integer)job.getParameterValue("excludeLimit");
110 
111  // Predefined formulas
112  ItemQuery<Formula> formulaQuery = Formula.getQuery(Formula.Type.COLUMN_RESTRICTION, rdt,
113      source.getIntensityTransform());
114  formulaQuery.order(Orders.asc(Hql.property("name")));
115  formulaQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
116  ItemResultList<Formula> formulas = formulaQuery.list(dc);
117  StringBuilder formulaOptions = new StringBuilder();
118  for (Formula f : formulas)
119  {
120    String formula = f.getFormula(0);
121    if (maxRawMappings == 1 || !formula.contains("raw("))
122    {
123      addFormulaOption(formulaOptions, formula, f.getName(), f.getDescription());
124    }
125  }
126  %>
127  <base:page type="popup" title="Filter bioassay set">
128  <base:head scripts="linkitems.js" styles="parameters.css">
129    <script language="JavaScript">
130    function hideErrorList()
131    {
132      Main.hide('errorlist');
133      Main.show('showerrorlist');
134    }
135    function showErrorList()
136    {
137      Main.show('errorlist');
138      Main.hide('showerrorlist');
139    }
140
141    function presetOnChange(list, formula, label)
142    {
143      var index = list.selectedIndex;
144      formula.value = list[index].value;
145      if (list[index].value != '' && label) label.value = list[index].text;
146    }
147    function openExpressionBuilder()
148    {
149      Main.expressionBuilder('<%=ID%>', 'Expression', 'filter', 'parameter:expression', 'COLUMN_RESTRICTION', '<%=rdt.getId()%>', <%=rdt.getChannels()%>, true, <%=source.getId()%>);
150    }
151    function validate()
152    {
153      var frm = document.forms['filter'];
154      var exclude = Main.trimString(frm['parameter:excludeLimit'].value);
155      var include = Main.trimString(frm['parameter:includeLimit'].value);
156     
157      if (!frm.allBioAssays.checked && frm.bioAssays.length == 0)
158      {
159        alert('You have not selected any bioassays');
160        return false;
161      }
162      else if (Main.trimString(frm['parameter:childName'].value) == '')
163      {
164        alert('You must enter a name for the child bioassay set');
165        frm['parameter:name'].focus();
166        return false;   
167      }
168      else if (Main.trimString(frm['parameter:expression'].value) == '')
169      {
170        alert('You must enter a filter expression');
171        frm['parameter:expression'].focus();
172        return false;
173      }
174      <%
175      if (maxRawMappings != 1)
176      {
177        %>
178        else if (frm['parameter:expression'].value.search(/raw\(/) != -1)
179        {
180          alert('Can\'t use function raw() for bioassayset with multiple mappings to raw data');
181          frm['parameter:expression'].focus();
182          return false;
183        }
184        <%
185      }
186      %>
187      else if (exclude != '' || include != '')
188      {
189        exclude = parseInt(exclude);
190        include = parseInt(include);
191       
192        if (include < 1 || include > <%=numBioAssays%>)
193        {
194          alert('The "include" value must be between 1 and <%=numBioAssays%>');
195          frm['parameter:includeLimit'].focus();
196          return false;
197        }
198        else if (exclude < 1 || exclude > <%=numBioAssays%>)
199        {
200          alert('The "exclude" value must be between 1 and <%=numBioAssays%>');
201          frm['parameter:excludeLimit'].focus();
202          return false;
203        }
204        else if (exclude > include)
205        {
206          alert('The "include" value can\'t be smaller than the "exclude" value.');
207          return false;
208        }
209      }
210      return true;
211    }
212    function doNext()
213    {
214      if (validate())
215      {
216        var frm = document.forms['filter'];
217        if (!frm.allBioAssays.checked)
218        {
219          var ids = Link.getListIds(frm.bioAssays, 'R');
220          for (var i = 0; i < ids.length; i++)
221          {
222            Forms.createHidden(frm, 'parameter:bioAssays', ids[i]);
223          }
224        }
225        frm.submit();
226      }
227    }
228    function doCancel()
229    {
230      location = 'index.jsp?ID=<%=ID%>&cmd=CancelWizard';
231    }
232
233    function allBioAssaysOnClick()
234    {
235      var frm = document.forms['filter'];
236      frm.bioAssays.disabled = frm.allBioAssays.checked;
237    }
238
239    function addBioAssaysOnClick()
240    {
241      var frm = document.forms['filter'];
242      if (frm.allBioAssays.checked)
243      {
244        return;
245      }
246      var ids = Link.getListIds(frm.bioAssays, 'R');
247      var excludes = ids.join(',');
248      var url = '../../views/experiments/bioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addBioAssayCallback&bioassayset_id=<%=source.getId()%>';
249      url += "&exclude="+excludes;
250      Main.openPopup(url, 'AddBioAssays', 1000, 700);
251    }
252    function addBioAssayCallback(bioAssayId, name)
253    {
254      var item = Link.getItem('R', bioAssayId);
255      if (!item) item = new Item('R', bioAssayId, name);
256      Link.addItem(document.forms['filter'].bioAssays, item);
257    }
258    function removeBioAssaysOnClick()
259    {
260      var frm = document.forms['filter'];
261      if (frm.allBioAssays.checked)
262      {
263        return;
264      }
265      Link.removeSelected(frm.bioAssays);
266    }
267   
268    function init()
269    {
270      initBioAssays();
271    }
272   
273    function initBioAssays()
274    {
275      var frm = document.forms['filter'];
276      <%
277      if (bioAssays != null)
278      {
279        for (BioAssay ba : bioAssays)
280        {
281          %>
282          Link.addNewItem(frm.bioAssays, new Item('R', <%=ba.getId()%>, '<%=HTML.javaScriptEncode(ba.getName())%>'));
283          <%
284        }
285      }
286      %>
287      frm.allBioAssays.checked = frm.bioAssays.length == 0;
288      allBioAssaysOnClick();
289    }
290    </script>
291
292  </base:head>
293  <base:body onload="init()">
294    <form name="filter" action="index.jsp" method="post" onsubmit="return false;">
295    <input type="hidden" name="ID" value="<%=ID%>">
296    <input type="hidden" name="requestId" value="<%=request.getParameter("requestId")%>">
297    <input type="hidden" name="cmd" value="SetParameters">
298    <input type="hidden" name="parameter:source" value="<%=source.getId()%>">
299   
300    <h3 class="docked">Filter bioassay set <base:help helpid="jepfilter.options"/></h3>
301    <div class="boxed">
302    <%
303    if (errorMessage != null || (errors != null && errors.size() > 0))
304    {
305      %>
306      <div id="errors" style="margin-bottom: 12px;" class="parameterhelp">
307        <div class="error" style="margin: 0px;">
308        <%=errorMessage %>
309        </div>
310        <%
311        if (errors != null && errors.size() > 0)
312        {
313          %>
314          <div id="showerrorlist" style="display: none;">
315            <base:icon image="bullet.gif" /><a href="javascript:showErrorList()">Show details</a>
316          </div>
317          <div id="errorlist">
318          <ol>
319          <%
320          for (Throwable t : errors)
321          {
322            %>
323            <li><%=t.getMessage()%><br>
324            <%
325          }
326          %>
327          </ol>
328          <base:icon image="bullet.gif" /><a href="javascript:hideErrorList()">Hide details</a>
329          </div>
330          <%
331        }
332        %>
333      </div>
334      <%
335    }
336    %>
337
338    <table class="form">
339    <tr>
340      <td class="prompt" colspan="2">Source</td>
341    </tr>
342    <tr >
343      <td>&nbsp;Bioassay set</td>
344      <td><%=HTML.encodeTags(source.getName())%></td>
345    </tr>
346    <tr >
347      <td>&nbsp;Bioassays</td>
348      <td>
349        <input type="checkbox" name="allBioAssays" id="allBioAssays"
350          onclick="allBioAssaysOnClick()"><label for="allBioAssays">All bioassays</label><br>
351        <table border="0" cellspacing="0" cellpadding="0">
352        <tr >
353        <td>
354          <select name="bioAssays" size="5" multiple style="width: 20em;">
355          </select>
356        </td>
357        <td>
358          <table border="0">
359          <tr><td width="150"><base:button 
360            onclick="addBioAssaysOnClick()" 
361            title="Add&nbsp;bioassays&hellip;" 
362            tooltip="Add bioassays"
363            /></td></tr>
364          <tr><td width="150"><base:button 
365            onclick="removeBioAssaysOnClick()" 
366            title="Remove" 
367            tooltip="Remove the selected bioassays"
368          /></td></tr>
369          </table>
370        </td>
371        </tr>
372        </table>
373      </td>
374    </tr>
375    <tr>
376      <td class="prompt" colspan="2">Child bioassay set</td>
377    </tr>
378    <tr>
379      <td>&nbsp;Name</td>
380      <td>
381        <input type="text" class="text required" size="50" maxlength="255" 
382          name="parameter:childName" 
383          value="<%=HTML.encodeTags(childName)%>"></td>
384    </tr>
385    <tr >
386      <td>&nbsp;Description</td>
387      <td nowrap>
388        <textarea class="text" rows="3" cols="50" name="parameter:childDescription" 
389          ><%=HTML.encodeTags(childDescription) %></textarea>
390        <a href="javascript:Main.zoom('Description', 'transformation', 'parameter:childDescription')"
391          title="Edit in larger window"><base:icon image="zoom.png" /></a>
392      </td>
393    </tr>
394
395    <tr>
396      <td class="prompt" colspan="2">Filter</td>
397    </tr>
398    <tr>
399      <td>&nbsp;Presets</td>
400      <td>
401      <select name="presets" style="width: 32em;"
402        onchange="presetOnChange(this, this.form['parameter:expression'])" 
403        >
404        <option value="">- select from list or enter formula below -
405        <%=formulaOptions.toString()%>
406      </select>
407      </td>
408    </tr>
409    <tr >
410      <td>&nbsp;Expression</td>
411      <td>
412        <table border="0" cellspacing="0" cellpadding="0">
413        <tr >
414        <td>
415          <textarea class="text required" name="parameter:expression" 
416            rows="3" cols="50"><%=HTML.encodeTags(expression)%></textarea>&nbsp;
417        </td>
418        <td><base:button onclick="openExpressionBuilder()" 
419          title="Expression builder&hellip;" 
420          image="expression_builder.gif"
421          tooltip="A simple utility for building expressions" />
422        </td>
423        </tr>
424        </table>
425      </td>
426    </tr>
427
428    <tr >
429      <td>&nbsp;</td>
430      <td>Keep non-matching spots from all bioassays if the filter matches that spot in at least<br>
431        <input class="text" type="text" name="parameter:includeLimit" 
432          size="4" maxlength="10" value="<%=includeLimit == null ? "" : includeLimit.toString()%>"
433          onkeypress="return Numbers.integerOnly(event)">
434        bioassay(s) [1 - <%=numBioAssays%>]
435      </td>
436    </tr>
437   
438    <tr >
439      <td>&nbsp;</td>
440      <td>Exclude matching spots from all bioassays if the filter doesn't match that spot in at least<br>
441        <input class="text" type="text" name="parameter:excludeLimit" 
442          size="4" maxlength="10" value="<%=excludeLimit == null ? "" : excludeLimit.toString()%>"
443          onkeypress="return Numbers.integerOnly(event)">
444        bioassay(s) [1 - <%=numBioAssays%>]
445      </td>
446    </tr>
447
448    </table>
449    </div>
450    </form>
451 
452    <table align="center">
453    <tr>
454      <td width="50%"><base:button onclick="doNext();" title="Next" /></td>
455      <td width="50%"><base:button onclick="doCancel();" title="Cancel" /></td>
456    </tr>
457    </table>
458  </base:body>
459  </base:page>
460  <%
461}
462finally
463{
464  if (dc != null) dc.close();
465}
466%>
467
Note: See TracBrowser for help on using the repository browser.