source: trunk/www/plugins/net/sf/basedb/plugins/jep_filter.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: 14.3 KB
Line 
1<%-- $Id: jep_filter.jsp 5923 2012-01-11 14:29:26Z 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      frm.allBioAssays.checked = false;
243      frm.bioAssays.disabled = false;
244      var ids = Link.getListIds(frm.bioAssays, 'R');
245      var excludes = ids.join(',');
246      var url = '../../views/experiments/bioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addBioAssayCallback&bioassayset_id=<%=source.getId()%>';
247      url += "&exclude="+excludes;
248      Main.openPopup(url, 'AddBioAssays', 1000, 700);
249    }
250    function addBioAssayCallback(bioAssayId, name)
251    {
252      var item = Link.getItem('R', bioAssayId);
253      if (!item) item = new Item('R', bioAssayId, name);
254      Link.addItem(document.forms['filter'].bioAssays, item);
255    }
256    function removeBioAssaysOnClick()
257    {
258      var frm = document.forms['filter'];
259      if (frm.allBioAssays.checked)
260      {
261        return;
262      }
263      Link.removeSelected(frm.bioAssays);
264    }
265   
266    function init()
267    {
268      initBioAssays();
269    }
270   
271    function initBioAssays()
272    {
273      var frm = document.forms['filter'];
274      <%
275      if (bioAssays != null)
276      {
277        for (BioAssay ba : bioAssays)
278        {
279          %>
280          Link.addNewItem(frm.bioAssays, new Item('R', <%=ba.getId()%>, '<%=HTML.javaScriptEncode(ba.getName())%>'));
281          <%
282        }
283      }
284      %>
285      frm.allBioAssays.checked = frm.bioAssays.length == 0;
286      allBioAssaysOnClick();
287    }
288    </script>
289
290  </base:head>
291  <base:body onload="init()">
292    <h1>Filter bioassay set <base:help helpid="jepfilter.options"/></h1>
293    <form name="filter" action="index.jsp" method="post" onsubmit="return false;">
294    <input type="hidden" name="ID" value="<%=ID%>">
295    <input type="hidden" name="requestId" value="<%=request.getParameter("requestId")%>">
296    <input type="hidden" name="cmd" value="SetParameters">
297    <input type="hidden" name="parameter:source" value="<%=source.getId()%>">
298   
299    <div class="content bottomborder">
300    <table class="fullform input100">
301    <%
302    if (errorMessage != null || (errors != null && errors.size() > 0))
303    {
304      %>
305      <tr>
306        <th></th>
307        <td colspan="2">
308        <div id="errors" style="margin-bottom: 12px;">
309          <div class="messagecontainer error" style="margin: 0px;">
310          <%=errorMessage %>
311          <%
312          if (errors != null && errors.size() > 0)
313          {
314            %>
315            <div id="showerrorlist">
316              <base:icon image="gonext.png" 
317                onclick="showErrorList()" 
318                style="color: #FFFFFF;"
319                tooltip="Show more information about the error"
320              />
321            </div>
322            <div id="errorlist" style="display: none; margin: 0px;">
323              <base:icon image="move_down.png" 
324                onclick="hideErrorList()" 
325                style="color: #FFFFFF;" 
326                tooltip="Show less information"
327              />
328              <ol>
329              <%
330              for (Throwable t : errors)
331              {
332                %>
333                <li><%=t.getMessage()%>
334                <%
335              }
336              %>
337              </ol>
338            </div>
339            <%
340          }
341          %>
342        </div>
343        </td>
344      </tr>
345      <%
346    }
347    %>
348    <tr>
349      <th>Source</th>
350      <td colspan="2"><%=HTML.encodeTags(source.getName())%></td>
351    </tr>
352    <tr class="big">
353      <th class="subprompt">Bioassays</th>
354      <td>
355        <input type="checkbox" name="allBioAssays" id="allBioAssays"
356          onclick="allBioAssaysOnClick()"><label for="allBioAssays">All bioassays</label><br>
357        <div class="selectionlist">
358          <table>
359          <tr>
360          <td>
361            <select name="bioAssays" size="5" multiple>
362            </select>
363          </td>
364          <td style="vertical-align: top;">
365            <base:buttongroup vertical="true">
366              <base:button 
367                subclass="leftaligned"
368                onclick="addBioAssaysOnClick()" 
369                title="Add bioassays&hellip;" 
370                tooltip="Add bioassays"
371              />
372              <base:button 
373                subclass="leftaligned"
374                onclick="removeBioAssaysOnClick()" 
375                title="Remove" 
376                tooltip="Remove the selected bioassays"
377              />
378            </base:buttongroup>
379          </td>
380          </tr>
381          </table>
382        </div>
383      </td>
384      <td></td>
385    </tr>
386    <tr>
387      <th>Child bioassay set</th>
388      <td colspan="2"></td>
389    </tr>
390    <tr>
391      <th class="subprompt">Name</th>
392      <td>
393        <input type="text" class="text required" maxlength="255" 
394          name="parameter:childName" 
395          value="<%=HTML.encodeTags(childName)%>"></td>
396      <td></td>
397    </tr>
398    <tr class="dynamic">
399      <th class="subprompt">Description</th>
400      <td>
401        <textarea class="text" rows="3" name="parameter:childDescription" 
402          ><%=HTML.encodeTags(childDescription) %></textarea>
403      </td>
404      <td style="width: 20px;">
405        <base:icon image="zoom.png" 
406          onclick="Main.zoom('Description', 'filter', 'description')"
407          tooltip="Edit in larger window"
408        />
409      </td>
410    </tr>
411
412    <tr>
413      <th>Filter</th>
414      <td>
415        <select name="presets" style="width: 30em;"
416          onchange="presetOnChange(this, this.form['parameter:expression'])" 
417          >
418          <option value="">- select from list or enter formula below -
419          <%=formulaOptions.toString()%>
420        </select>
421      </td>
422      <td></td>
423    </tr>
424    <tr class="big">
425      <th class="subprompt">Expression</th>
426      <td>
427        <textarea class="text required" name="parameter:expression" 
428            rows="3" ><%=HTML.encodeTags(expression)%></textarea>
429      </td>
430      <td style="width: 20px;">
431        <base:icon onclick="openExpressionBuilder()" 
432          image="expression_builder.gif"
433          tooltip="A simple utility for building expressions"
434        />
435      </td>
436    </tr>
437    <tr>
438      <th class="subprompt">Keep</th>
439      <td>Keep non-matching spots from all bioassays if the filter matches that spot in at least<br>
440        <input class="text" type="text" name="parameter:includeLimit" style="width: 5em;"
441          maxlength="10" value="<%=includeLimit == null ? "" : includeLimit.toString()%>"
442          onkeypress="return Numbers.integerOnly(event)">
443        bioassay(s) [1 - <%=numBioAssays%>]
444      </td>
445      <td></td>
446    </tr>
447    <tr>
448      <th class="subprompt">Exclude</th>
449      <td>Exclude matching spots from all bioassays if the filter doesn't match that spot in at least<br>
450        <input class="text" type="text" name="parameter:excludeLimit"  style="width: 5em;"
451          maxlength="10" value="<%=excludeLimit == null ? "" : excludeLimit.toString()%>"
452          onkeypress="return Numbers.integerOnly(event)">
453        bioassay(s) [1 - <%=numBioAssays%>]
454      </td>
455      <td></td>
456    </tr>
457    </table>
458    </div>
459    </form>
460 
461    <base:buttongroup subclass="dialogbuttons">
462      <base:button onclick="doNext();" title="Next" />
463      <base:button onclick="doCancel();" title="Cancel" />
464    </base:buttongroup>
465  </base:body>
466  </base:page>
467  <%
468}
469finally
470{
471  if (dc != null) dc.close();
472}
473%>
474
Note: See TracBrowser for help on using the repository browser.