Changeset 6314


Ignore:
Timestamp:
Sep 2, 2013, 2:47:53 PM (9 years ago)
Author:
Nicklas Nordborg
Message:

References #1729 and #1730. Several edit dialogs in the 'View' menu. Expression builder, which required changes to the 'Validate' function which is now done on the server side instead of in the browser (due to the use of eval() on user input).

Location:
trunk
Files:
5 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/util/jep/Log2Function.java

    r6127 r6314  
    137137    }
    138138    Object argument = stack.pop();
    139     if (argument instanceof Integer)
     139    if (argument instanceof Number)
    140140    {
    141141      stack.push(log2((Number)argument));
  • trunk/www/common/expression_builder.jsp

    r6162 r6314  
    2323  @version 2.0
    2424--%>
    25 <%@page import="net.sf.basedb.core.StringUtil"%>
    2625<%@ page pageEncoding="UTF-8" session="false"
    2726  import="net.sf.basedb.core.DbControl"
     
    5756<%
    5857  String title = request.getParameter("title");
    59   String form = request.getParameter("form");
    6058  String textarea = request.getParameter("textarea");
    61   String callback = request.getParameter("callback");
    6259  Formula.Type formulaType = Formula.Type.valueOf(request.getParameter("formulatype"));
    6360  RawDataType rawDataType = RawDataTypes.getRawDataType(request.getParameter("rawdatatype"));
     
    6663  int channels = Values.getInt(request.getParameter("channels"));
    6764  final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
    68  
     65
    6966  DbControl dc = sc.newDbControl();
    7067  try
     
    9794  %>
    9895  <base:page type="popup" title="<%=title%>">
    99   <base:head scripts="table.js" styles="toolbar.css">
    100     <script>
    101     function getText()
    102     {
    103       document.forms['expression'].expression.value = window.opener.document.forms['<%=form%>'].elements['<%=textarea%>'].value;
    104     }
    105     function setExpressionAndClose()
    106     {
    107       var value = document.forms['expression'].expression.value;
    108       <%
    109       if (callback != null)
    110       {
    111         StringBuilder sb = new StringBuilder();
    112         sb.append("window.opener.");
    113         sb.append(callback).append("(");
    114         if (form != null) sb.append("'").append(form).append("',");
    115         if (textarea != null) sb.append("'").append(textarea).append("',");
    116         sb.append("value)");
    117         %>
    118         <%=sb.toString()%>
    119         <%
    120       }
    121       else
    122       {
    123         %>
    124         var textElement = window.opener.document.forms['<%=form%>'].elements['<%=textarea%>'];
    125         if (textElement.type == 'text') value = value.replace(/\n/g, '');
    126         textElement.value = value;
    127         <%
    128       }
    129       %>
    130       window.close();
    131     }
    132     function insertSelected(list, prefix, suffix)
    133     {
    134       var value = list[list.selectedIndex].value;
    135       if (value != '')
    136       {
    137         if (prefix) value = prefix + value;
    138         if (!suffix) suffix = '';
    139         encloseSelection(value, suffix);
    140       }
    141       list.selectedIndex = 0;
    142     }
    143     function insertReporterListFunction()
    144     {
    145       var frm = document.forms['expression'];
    146       var listFunction = frm.listFunction[frm.listFunction.selectedIndex].value;
    147       var listId = frm.reporterList[frm.reporterList.selectedIndex].value;
    148       encloseSelection(listFunction+'(' + listId + ')', '');
    149       frm.reporterList.selectedIndex = 0;
    150     }
    151  
    152     /*
    153       Enclose the selected text with prefix and suffix. Code taken
    154       from Trac: http://projects.edgewall.com/trac/
    155     */
    156     function encloseSelection(prefix, suffix)
    157     {
    158       var frm = document.forms['expression'];
    159       var textarea = frm.expression;
    160       textarea.focus();
    161         var start, end, sel, scrollPos, subst;
    162         if (typeof(document["selection"]) != "undefined")
    163         {
    164           sel = document.selection.createRange().text;
    165         }
    166         else if (typeof(textarea["setSelectionRange"]) != "undefined")
    167         {
    168           start = textarea.selectionStart;
    169           end = textarea.selectionEnd;
    170           scrollPos = textarea.scrollTop;
    171           sel = textarea.value.substring(start, end);
    172         }
    173         if (sel.match(/ $/))
    174         {
    175           // exclude ending space char, if any
    176             sel = sel.substring(0, sel.length - 1);
    177             suffix = suffix + " ";
    178         }
    179         subst = prefix + sel + suffix;
    180         if (typeof(document["selection"]) != "undefined")
    181         {
    182           var range = document.selection.createRange().text = subst;
    183           textarea.caretPos -= suffix.length;
    184         }
    185         else if (typeof(textarea["setSelectionRange"]) != "undefined")
    186         {
    187           textarea.value = textarea.value.substring(0, start) + subst +
    188                            textarea.value.substring(end);
    189           if (sel)
    190           {
    191             textarea.setSelectionRange(start + subst.length, start + subst.length);
    192           }
    193           else
    194           {
    195             textarea.setSelectionRange(start + prefix.length, start + prefix.length);
    196           }
    197           textarea.scrollTop = scrollPos;
    198         }
    199       }
    200    
    201     var properties = new Array();
    202     <%
    203     for (TableColumn tc : rawProperties)
    204     {
    205       %>
    206       properties['raw.<%=tc.getProperty()%>'] = 1;
    207       <%
    208     }
    209     for (TableColumn tc : reporterProperties)
    210     {
    211       %>
    212       properties['reporter.<%=tc.getProperty()%>'] = 1;
    213       <%
    214     }
    215     %>
    216      
    217     function validateOnClick()
    218     {
    219       var frm = document.forms['expression'];
    220       if (frm.expression.value != '')
    221       {
    222         var expression = frm.expression.value.replace('if(', 'jepIf(');
    223         try
    224         {
    225           var result = eval(expression);
    226           alert('The expressions seems to be ok.\nNote! This feature is experimental and may not be 100% correct.');
    227         }
    228         catch (er)
    229         {
    230           alert(er + '\nNote! This feature is experimental and may not be 100% correct.');
    231         }
    232       }
    233     }
    234    
    235     function raw(property)
    236     {
    237       <%
    238       if (maxRawMappings != 1)
    239       {
    240         %>
    241         throw 'Cannot use function raw() for bioassayset that has multiple mappings to raw data';
    242         <%
    243       }
    244       %>
    245       var rdt = '<%=rawDataType == null ? "" : rawDataType.getId()%>';
    246       if (!property) throw 'Property must be specified for function raw()';
    247       if (rdt == '') throw 'Cannot use function raw(). No raw data type selected';
    248       if (!properties['raw.'+property]) throw 'Property '+property+' not found for raw data type ' + rdt;
    249       return Math.random() * 100;
    250     }
    251    
    252     function mean(property)
    253     {
    254       var rdt = '<%=rawDataType == null ? "" : rawDataType.getId()%>';
    255       if (!property) throw 'Property must be specified for function mean()';
    256       if (rdt == '') throw 'Cannot use function mean(). No raw data type selected';
    257       if (!properties['property.'+property]) throw 'Property '+property+' not found for raw data type ' + rdt;
    258       return Math.random() * 100;
    259     }
    260  
    261     function ch(channel)
    262     {
    263       checkChannel('ch()', channel);
    264       return channel;
    265     }
    266     function rawCh(channel)
    267     {
    268       checkChannel('rawCh()', channel);
    269       return channel;
    270     }
    271     function checkChannel(name, channel)
    272     {
    273       var type = '<%=formulaType.name()%>';
    274       if (type == '<%=Formula.Type.INTENSITY_EXPRESSION.name()%>')
    275       {
    276         // Channel function not available
    277         throw 'Function ' + name + ' is not available for ' + type;
    278       }
    279       var channels = <%=channels%>;
    280       if (!channel || channel <= 0 || channel > channels)
    281       {
    282         throw 'Invalid channel: ' + channel + '; must be between 1 and '+ channels;
    283       }
    284     }
    285 
    286 
    287    
    288     function pos()
    289     {
    290       return Math.random() * 100;
    291     }
    292     function rep(property)
    293     {
    294       if (!property) throw 'Property must be specified for function rep()';
    295       if (!properties['reporter.'+property]) throw 'Property '+property+' not found for reporter';
    296       return Math.random() * 100;
    297     }
    298    
    299     function xtra(arg)
    300     {
    301       if (!arg) throw 'One argument is required for function xtra()';
    302       return Math.random() * 100;
    303     }
    304    
    305     function log(value)
    306     {
    307       return Math.log(value);
    308     }
    309     function log2(value)
    310     {
    311       return Math.log(value);
    312     }
    313     function ln(value)
    314     {
    315       return Math.log(value);
    316     }
    317     function sqrt(value)
    318     {
    319       return Math.sqrt(value);
    320     }
    321     function abs(value)
    322     {
    323       return Math.abs(value);
    324     }
    325     function exp(value)
    326     {
    327       return Math.exp(value);
    328     }
    329     function score(reporterListId)
    330     {
    331       return Math.random() * 100;
    332     }
    333     function jepIf(condition, ifTrue, ifFalse)
    334     {
    335       if (condition == undefined || ifTrue == undefined || ifFalse == undefined)
    336       {
    337         throw 'if() needs 3 arguments';
    338       }
    339       return condition ? ifTrue : ifFalse;
    340     }
    341     </script>
    342   </base:head>
    343   <base:body onload="getText()">
     96  <base:head scripts="table.js,~expression_builder.js" styles="toolbar.css" />
     97  <base:body>
    34498    <h1>Expression builder <base:help helpid="expressionbuilder" /></h1>
     99    <div id="page-data" class="datacontainer"
     100      data-textarea="<%=textarea%>"
     101      data-formula-type="<%=formulaType.name() %>"
     102      data-raw-data-type="<%=rawDataType == null ? "" : rawDataType.getId()%>"
     103      data-channels="<%=channels%>"
     104    ></div>
    345105 
    346106    <form name="expression">
     
    356116          <tbl:button
    357117            title="AND"
     118            subclass="auto-init"
     119            data-auto-init="enclose-selection"
     120            data-prefix=" &amp;&amp; "
     121            data-suffix=""
    358122            tooltip="BOOLEAN AND: expr1 &amp;&amp; expr2"
    359             onclick="encloseSelection(' &amp;&amp; ', '')"
    360123          />
    361124          <tbl:button
    362125            title="OR"
     126            subclass="auto-init"
     127            data-auto-init="enclose-selection"
     128            data-prefix=" || "
     129            data-suffix=""
    363130            tooltip="BOOLEAN OR: expr1 || expr2"
    364             onclick="encloseSelection(' || ', '')"
    365131          />
    366132          <tbl:button
    367133            title="NOT"
     134            subclass="auto-init"
     135            data-auto-init="enclose-selection"
     136            data-prefix="!"
     137            data-suffix=""
    368138            tooltip="BOOLEAN NOT: !expr1"
    369             onclick="encloseSelection('!', '')"
    370139          />
    371140          <tbl:button
    372141            title="=="
     142            subclass="auto-init"
     143            data-auto-init="enclose-selection"
     144            data-prefix=" == "
     145            data-suffix=""
    373146            tooltip="EQUAL: expr1 == expr2"
    374             onclick="encloseSelection(' == ', '')"
    375147          />
    376148          <tbl:button
    377149            title="!="
     150            subclass="auto-init"
     151            data-auto-init="enclose-selection"
     152            data-prefix=" != "
     153            data-suffix=""
    378154            tooltip="INEQUAL: expr1 != expr2"
    379             onclick="encloseSelection(' != ', '')"
    380155          />
    381156          <tbl:button
    382157            title="&lt;"
     158            subclass="auto-init"
     159            data-auto-init="enclose-selection"
     160            data-prefix=" &lt; "
     161            data-suffix=""
    383162            tooltip="LESS: expr1 &lt; expr2"
    384             onclick="encloseSelection(' &lt; ', '')"
    385163          />
    386164          <tbl:button
    387165            title="&lt;="
     166            subclass="auto-init"
     167            data-auto-init="enclose-selection"
     168            data-prefix=" &lt;= "
     169            data-suffix=""
    388170            tooltip="LESS OR EQUAL: expr1 &lt;= expr2"
    389             onclick="encloseSelection(' &lt;= ', '')"
    390171          />
    391172          <tbl:button
    392173            title="&gt;="
     174            subclass="auto-init"
     175            data-auto-init="enclose-selection"
     176            data-prefix=" &gt;= "
     177            data-suffix=""
    393178            tooltip="MORE OR EQUAL: expr1 &gt;= expr2"
    394             onclick="encloseSelection(' &gt;= ', '')"
    395179            visible="<%=restrictions%>"
    396180          />
    397181          <tbl:button
    398182            title="&gt;"
     183            subclass="auto-init"
     184            data-auto-init="enclose-selection"
     185            data-prefix=" &gt; "
     186            data-suffix=""
    399187            tooltip="MORE: expr1 &gt; expr2"
    400             onclick="encloseSelection(' &gt; ', '')"
    401188          />
    402189          <tbl:button
    403190            title="+"
     191            subclass="auto-init"
     192            data-auto-init="enclose-selection"
     193            data-prefix=" + "
     194            data-suffix=""
    404195            tooltip="ADD: expr1 + expr2"
    405             onclick="encloseSelection(' + ', '')"
    406196          />
    407197          <tbl:button
    408198            title="-"
     199            subclass="auto-init"
     200            data-auto-init="enclose-selection"
     201            data-prefix=" - "
     202            data-suffix=""
    409203            tooltip="SUBTRACT: expr1 - expr2"
    410             onclick="encloseSelection(' - ', '')"
    411204          />
    412205          <tbl:button
    413206            title="*"
     207            subclass="auto-init"
     208            data-auto-init="enclose-selection"
     209            data-prefix=" * "
     210            data-suffix=""
    414211            tooltip="MULTIPLY: expr1 * expr2"
    415             onclick="encloseSelection(' * ', '')"
    416212          />
    417213          <tbl:button
    418214            title="/"
     215            subclass="auto-init"
     216            data-auto-init="enclose-selection"
     217            data-prefix=" / "
     218            data-suffix=""
    419219            tooltip="DIVIDE: expr1 / expr2"
    420             onclick="encloseSelection(' / ', '')"
    421220          />
    422221          <tbl:button
    423222            title="( )"
     223            subclass="auto-init"
     224            data-auto-init="enclose-selection"
     225            data-prefix="("
     226            data-suffix=")"
    424227            tooltip="PARENTHESIS: (expr1)"
    425             onclick="encloseSelection('(', ')')"
    426228          />
    427229        </tbl:toolbar>
     
    439241            <tbl:button
    440242              title="<%=function%>"
     243              subclass="auto-init"
     244              data-auto-init="enclose-selection"
     245              data-prefix="<%=function+"(" %>"
     246              data-suffix=")"
    441247              tooltip="<%=functions.getValue(i)%>"
    442               onclick="<%="encloseSelection('" + function +"(', ')')"%>"
    443248            />
    444249            <%
     
    451256          <tbl:button
    452257            title="null"
     258            subclass="auto-init"
     259            data-auto-init="enclose-selection"
     260            data-prefix=""
     261            data-suffix="null"
    453262            tooltip="The null (unknown) value"
    454             onclick="<%="encloseSelection('', 'null')"%>"
    455263          />
    456264          <tbl:button
    457265            title="pi"
     266            subclass="auto-init"
     267            data-auto-init="enclose-selection"
     268            data-prefix=""
     269            data-suffix="<%=Math.PI%>"
    458270            tooltip="<%="The pi value: " + Math.PI %>"
    459             onclick="<%="encloseSelection('', '"+Math.PI+"')"%>"
    460271          />
    461272          <tbl:button
    462273            title="e"
     274            subclass="auto-init"
     275            data-auto-init="enclose-selection"
     276            data-prefix=""
     277            data-suffix="<%=Math.E %>"
    463278            tooltip="<%="The base of the natural logarithm: " + Math.E%>"
    464             onclick="<%="encloseSelection('', '"+Math.E+"')"%>"
    465279          />
    466280        </tbl:toolbar>
    467281        <tbl:toolbar subclass="bottomborder">
    468           <td class="label">Spot:
    469             <select name="spot" onchange="insertSelected(this)" style="width: 12em;">
    470             <option value="">- select -
     282          <%
     283          if (formulaType != Formula.Type.INTENSITY_EXPRESSION)
     284          {
     285            %>
     286            <td class="label">Spot:
     287              <select name="spot" id="spot" style="width: 12em;">
     288              <option value="">- select -
     289              <%
     290              for (TableColumn tc : spotProperties)
     291              {
     292                if (tc.getJepExpression() != null)
     293                {
     294                  %>
     295                  <option data-prefix="<%=tc.getJepExpression()%>"
     296                    title="<%=HTML.encodeTags(tc.getDescription())%>"><%=HTML.encodeTags(tc.getTitle())%>
     297                  <%
     298                }
     299              }
     300              %>
     301              </select>   
     302            </td>
    471303            <%
    472             for (TableColumn tc : spotProperties)
    473             {
    474               if (tc.getJepExpression() != null)
    475               {
    476                 %>
    477                 <option value="<%=tc.getJepExpression()%>"
    478                   title="<%=HTML.encodeTags(tc.getDescription())%>"><%=HTML.encodeTags(tc.getTitle())%>
    479                 <%
    480               }
    481             }
    482             %>
    483             </select>   
    484           </td>
     304          }
     305          %>
    485306          <%
    486307          if (rawDataType != null && rawDataType.isStoredInDb() && rawProperties.size() > 0)
     
    488309            %>
    489310            <td class="label">Raw data:
    490               <select name="rawdata" onchange="insertSelected(this)" style="width: 12em;">
     311              <select name="rawdata" id="rawdata" style="width: 12em;">
    491312              <option value="">- select -
    492313              <%
     
    494315              {
    495316                %>
    496                 <option value="<%=tc.getJepExpression()%>"
     317                <option data-prefix="<%=tc.getJepExpression()%>"
    497318                  title="<%=HTML.encodeTags(tc.getDescription())%>"><%=HTML.encodeTags(tc.getTitle())%>
    498319                <%
     
    506327         
    507328          <td class="label">Reporter:
    508             <select name="reporter" onchange="insertSelected(this)" style="width: 12em;">
     329            <select name="reporter" id="reporter" style="width: 12em;">
    509330            <option value="">- select -
    510331              <%
     
    512333              {
    513334                %>
    514                 <option value="<%=tc.getJepExpression()%>"
     335                <option data-prefix="<%=tc.getJepExpression()%>"
    515336                  title="<%=HTML.encodeTags(tc.getDescription())%>"><%=HTML.encodeTags(tc.getTitle())%>
    516337                <%
     
    537358            </select>
    538359           
    539             <select name="reporterList" onchange="insertReporterListFunction()">
     360            <select name="reporterList" id="reporterList">
    540361            <option value="">- select -
    541362              <%
     
    565386    <base:buttongroup subclass="dialogbuttons">
    566387      <base:button
    567         onclick="validateOnClick()" title="Validate&hellip;"
     388        id="btnValidate"
     389        title="Validate&hellip;"
    568390        image="validate_formula.png"
    569391        tooltip="Validate the expression. EXPERIMENTAL!!" />
    570       <base:button onclick="setExpressionAndClose()" title="Ok" />
    571       <base:button onclick="window.close()" title="Cancel" />
     392      <base:button id="btnSave" title="Ok" />
     393      <base:button id="close" title="Cancel" />
    572394    </base:buttongroup>
    573395  </base:body>
  • trunk/www/include/scripts/main-2.js

    r6308 r6314  
    10971097    url += '&title='+encodeURIComponent(title)+'&textarea='+textarea.id;
    10981098    Dialogs.openPopup(url, title.replace(/[^\w]/, ''), 450, 300);
     1099  }
     1100 
     1101  dialogs.openExpressionBuilder = function(textarea, title, formulaType, rawDataType, channels, bioAssaySetId)
     1102  {
     1103    textarea = Doc.element(textarea);
     1104    if (!title) title = textarea.id;
     1105
     1106    var url = App.getRoot()+'common/expression_builder.jsp?ID='+App.getSessionId();
     1107    url += '&title='+encodeURIComponent(title)+'&textarea='+textarea.id;
     1108    url += '&formulatype='+formulaType;
     1109    url += '&rawdatatype='+rawDataType;
     1110    url += '&channels='+channels;
     1111    url += '&restrictions=' + (formulaType == 'COLUMN_RESTRICTION' ? 1 : 0);
     1112    if (bioAssaySetId) url += '&bioassayset_id='+bioAssaySetId;
     1113    Dialogs.openPopup(url, title.replace(/[^\w]/, ''), 750, 500);
    10991114  }
    11001115 
  • trunk/www/views/derivedbioassays/bioassays.js

    r6311 r6314  
    3535    if (pageId == 'edit-page')
    3636    {
    37       // TODO
     37      // Save + Close buttons
     38      Buttons.addClickHandler('btnSave', bioassays.save);
     39      Buttons.addClickHandler('close', App.closeWindow);
     40
     41      // Tab validation
     42      TabControl.addTabActivateListener('settings.annotations', bioassays.loadAnnotationsFrame);
     43      TabControl.addTabActivateListener('settings.inheritedAnnotations', bioassays.loadInheritedAnnotationsFrame);
     44      TabControl.addTabActivateListener('settings.datafiles', bioassays.loadDataFilesFrame);
     45      TabControl.addTabValidator('settings.info', bioassays.validateBioAssay);
     46
     47      // Subtype
     48      Events.addEventHandler('subtype_id', 'change', bioassays.subtypeOnChange);
     49
     50      // Extract
     51      Buttons.addClickHandler('extract_id.select', bioassays.selectExtract);
     52      Events.addEventHandler('extract_id', 'base-selected', bioassays.setExtractCallback);
     53     
     54      // Protocol
     55      Buttons.addClickHandler('protocol_id.select', bioassays.selectProtocol);
     56      Events.addEventHandler('protocol_id', 'base-selected', bioassays.setProtocolCallback);
     57     
     58      // Hardware
     59      Buttons.addClickHandler('hardware_id.select', bioassays.selectHardware);
     60      Events.addEventHandler('hardware_id', 'base-selected', bioassays.setHardwareCallback);
     61     
     62      // Software
     63      Buttons.addClickHandler('software_id.select', bioassays.selectSoftware);
     64      Events.addEventHandler('software_id', 'base-selected', bioassays.setSoftwareCallback);
     65     
     66      // Parent derived bioassays
     67      Buttons.addClickHandler('btnAddParents', bioassays.addParents);
     68     
     69      // Parent physical bioassays
     70      Buttons.addClickHandler('btnAddPhysicalBioAssays', bioassays.addPhysicalBioAssays);
     71     
     72      // Parent type
     73      Events.addEventHandler('isRoot', 'click', bioassays.isRootOnChange);
     74      Events.addEventHandler('isChild', 'click', bioassays.isRootOnChange);
     75      var frm = document.forms['bioAssay'];
     76      if (frm.isRoot)
     77      {
     78        bioassays.isRootOnChange();
     79      }
    3880    }
    3981    else if (pageId == 'view-page')
     
    113155  }
    114156 
     157  bioassays.validateBioAssay = function()
     158  {
     159    var frm = document.forms['bioAssay'];
     160    if (Main.trimString(frm.name.value) == '')
     161    {
     162      Forms.showNotification(frm.name, 'You must enter a name');
     163      return false;
     164    }
     165    return true;
     166  }
     167
     168  bioassays.save = function()
     169  {
     170    var frm = document.forms['bioAssay'];
     171    if (TabControl.validateActiveTab('settings'))
     172    {
     173      Annotations.saveModifiedAnnotationsToForm(frm);
     174      Annotations.saveInheritedAnnotationsToForm(frm);
     175      DataFiles.writeFileActionsToForm(frm);
     176      if (Doc.element('physicalBioAssays'))
     177      {
     178        Link.exportActions('physicalBioAssays');
     179      }
     180      if (Doc.element('parents'))
     181      {
     182        Link.exportActions('parents');
     183      }
     184      frm.submit();
     185    }
     186  }
     187 
     188  bioassays.loadAnnotationsFrame = function()
     189  {
     190    Annotations.autoLoadEditFrame(bioassays.getProtocolId(), ItemSubtype.getSubtypeId('subtype_id'));
     191  }
     192 
     193  bioassays.loadInheritedAnnotationsFrame = function()
     194  {
     195    Annotations.autoLoadInheritFrame(bioassays.getParents());
     196  }
     197
     198  bioassays.loadDataFilesFrame = function()
     199  {
     200    var subtypeId = ItemSubtype.getSubtypeId('subtype_id');
     201    DataFiles.autoLoadEditFrame(0, 0, subtypeId);
     202  }
     203 
     204  bioassays.getProtocolId = function()
     205  {
     206    var frm = document.forms['bioAssay'];
     207    var protocolId = 0;
     208    if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
     209    {
     210      protocolId = Math.abs(parseInt(frm.protocol_id.value));       
     211    }
     212    return protocolId;
     213  }
     214 
     215  bioassays.getParents = function()
     216  {
     217    var frm = document.forms['bioAssay'];
     218   
     219    var parents = [];
     220    if (frm.physicalBioAssays && (!frm.isRoot || frm.isRoot[0].checked))
     221    {
     222      var ids = Link.getIdsInList(frm.physicalBioAssays, 'PHYSICALBIOASSAY');
     223      if (ids.length > 0)
     224      {
     225        parents[parents.length] = 'PHYSICALBIOASSAY:'+ids.join(':');
     226      }
     227    }
     228    else if (frm.parents && (!frm.isRoot || frm.isRoot[1].checked))
     229    {
     230      var ids = Link.getIdsInList(frm.parents, 'DERIVEDBIOASSAY');
     231      if (ids.length > 0)
     232      {
     233        parents[parents.length] = 'DERIVEDBIOASSAY:'+ids.join(':');
     234      }
     235    }
     236    var extractId = Math.abs(parseInt(frm.extract_id.value));
     237    if (extractId > 0) parents[parents.length] = 'EXTRACT:'+extractId;
     238    return parents;
     239  }
     240 
     241  bioassays.subtypeOnChange = function()
     242  {
     243    var frm = document.forms['bioAssay'];
     244    var subtypeId = ItemSubtype.getSubtypeId('subtype_id');
     245    var recentInfo = ItemSubtype.getRelatedProjectDefaultAndRecentItems('DERIVEDBIOASSAY', subtypeId, ['PROTOCOL', 'HARDWARE', 'SOFTWARE']);
     246    ItemSubtype.updateSelectionList(frm.protocol_id, recentInfo.PROTOCOL['recent'], recentInfo.PROTOCOL['default']);
     247    ItemSubtype.updateSelectionList(frm.hardware_id, recentInfo.HARDWARE['recent'], recentInfo.HARDWARE['default']);
     248    ItemSubtype.updateSelectionList(frm.software_id, recentInfo.SOFTWARE['recent'], recentInfo.SOFTWARE['default']);
     249  }
     250 
     251  bioassays.selectProtocol = function()
     252  {
     253    var frm = document.forms['bioAssay'];
     254    var url = '&resetTemporary=1';
     255    url += ItemSubtype.createRelatedFilter('subtype_id', 'PROTOCOL');
     256    if (frm.protocol_id.length > 1)
     257    {
     258      var id = Math.abs(parseInt(frm.protocol_id[1].value));       
     259      url += '&item_id='+id;
     260    }
     261    Dialogs.selectItem('PROTOCOL', 'protocol_id', 0, url);
     262  }
     263 
     264  bioassays.setProtocolCallback = function(event)
     265  {
     266    var frm = document.forms['bioAssay'];
     267    var list = frm.protocol_id;
     268    if (list.length < 2 || list[1].value == '0')
     269    {
     270      Forms.addListOption(list, 1, new Option());
     271    }
     272    list[1].value = event.detail.id;
     273    list[1].text = event.detail.name;
     274    list.selectedIndex = 1;
     275  }
     276
     277  bioassays.selectHardware = function()
     278  {
     279    var frm = document.forms['bioAssay'];
     280    var url = '&resetTemporary=1';
     281    url += ItemSubtype.createRelatedFilter('subtype_id', 'HARDWARE');
     282    if (frm.hardware_id.length > 1)
     283    {
     284      var id = Math.abs(parseInt(frm.hardware_id[1].value));       
     285      url += '&item_id='+id;
     286    }
     287    Dialogs.selectItem('HARDWARE', 'hardware_id', 0, url);
     288  }
     289 
     290  bioassays.setHardwareCallback = function(event)
     291  {
     292    var frm = document.forms['bioAssay'];
     293    var list = frm.hardware_id;
     294    if (list.length < 2 || list[1].value == '0')
     295    {
     296      Forms.addListOption(list, 1, new Option());
     297    }
     298    list[1].value = event.detail.id;
     299    list[1].text = event.detail.name;
     300    list.selectedIndex = 1;
     301  }
     302
     303  bioassays.selectSoftware = function()
     304  {
     305    var frm = document.forms['bioAssay'];
     306    var url = '&resetTemporary=1';
     307    url += ItemSubtype.createRelatedFilter('subtype_id', 'SOFTWARE');
     308    if (frm.software_id.length > 1)
     309    {
     310      var id = Math.abs(parseInt(frm.software_id[1].value));       
     311      url += '&item_id='+id;
     312    }
     313    Dialogs.selectItem('SOFTWARE', 'software_id', 0, url);
     314  }
     315 
     316  bioassays.setSoftwareCallback = function(event)
     317  {
     318    var frm = document.forms['bioAssay'];
     319    var list = frm.software_id;
     320    if (list.length < 2 || list[1].value == '0')
     321    {
     322      Forms.addListOption(list, 1, new Option());
     323    }
     324    list[1].value = event.detail.id;
     325    list[1].text = event.detail.name;
     326    list.selectedIndex = 1;
     327  }
     328 
     329  bioassays.isRootOnChange = function()
     330  {
     331    var frm = document.forms['bioAssay'];
     332    var isRoot = frm.isRoot[0].checked;
     333    Main.showHide('physicalBioAssaySection', isRoot);
     334    Main.showHide('parentBioAssaySection', !isRoot);
     335  }
     336
     337  bioassays.addParents = function()
     338  {
     339    var frm = document.forms['bioAssay'];
     340    var current = Link.getIdsInList(frm.parents, 'DERIVEDBIOASSAY');
     341    var url = "&resetTemporary=1&exclude="+current.join(',');
     342    url += ItemSubtype.createRelatedFilter('subtype_id', 'DERIVEDBIOASSAY');
     343    Dialogs.selectItem('DERIVEDBIOASSAY', 'parents', 1, url);
     344  }
     345 
     346  bioassays.addPhysicalBioAssays = function()
     347  {
     348    var frm = document.forms['bioAssay'];
     349    var current = Link.getIdsInList(frm.physicalBioAssays, 'PHYSICALBIOASSAY');
     350    var url = "&resetTemporary=1&exclude="+current.join(',');
     351    url += ItemSubtype.createRelatedFilter('subtype_id', 'PHYSICALBIOASSAY');
     352    Dialogs.selectItem('PHYSICALBIOASSAY', 'physicalBioAssays', 1, url);
     353  }
     354 
     355  bioassays.selectExtract = function()
     356  {
     357    var frm = document.forms['bioAssay'];
     358   
     359    var relatedExtractIds = null;
     360    if (frm.physicalBioAssays && (!frm.isRoot || frm.isRoot[0].checked))
     361    {
     362      var ids = Link.getIdsInList(frm.physicalBioAssays, 'PHYSICALBIOASSAY');
     363      if (ids.length > 0)
     364      {
     365        var request = Ajax.getXmlHttpRequest();
     366        var url = '../physicalbioassays/ajax.jsp?ID='+App.getSessionId();
     367        url += '&cmd=GetAllExtractIds&bioassay_ids=' + ids.join(',');
     368        request.open("GET", url, false);
     369        request.send(null);
     370        var response = JSON.parse(request.responseText);
     371        if (response.status != 'ok')
     372        {
     373          alert(response.message);
     374          return null;
     375        }
     376        relatedExtractIds = response.allExtractIds;
     377      }
     378    }
     379    else if (frm.parents && (!frm.isRoot || frm.isRoot[1].checked))
     380    {
     381      var ids = Link.getIdsInList(frm.parents, 'DERIVEDBIOASSAY');
     382      if (ids.length > 0)
     383      {
     384        var request = Ajax.getXmlHttpRequest();
     385        var url = 'ajax.jsp?ID='+App.getSessionId();
     386        url += '&cmd=GetAllExtractIds&bioassay_ids=' + ids.join(',');
     387        request.open("GET", url, false);
     388        request.send(null);
     389        var response = JSON.parse(request.responseText);
     390        if (response.status != 'ok')
     391        {
     392          alert(response.message);
     393          return null;
     394        }
     395        relatedExtractIds = response.allExtractIds;
     396      }
     397    }
     398
     399    var url = '&resetTemporary=1';
     400    if (relatedExtractIds)
     401    {
     402      url += '&tmpfilter:INT:id='+relatedExtractIds.join('|');
     403    }
     404    url += ItemSubtype.createRelatedFilter('subtype_id', 'EXTRACT');
     405    if (frm.extract_id.length > 1)
     406    {
     407      var id = Math.abs(parseInt(frm.extract_id[1].value));       
     408      url += '&item_id='+id;
     409    }
     410    Dialogs.selectItem('EXTRACT', 'extract_id', 0, url);
     411  }
     412 
     413  bioassays.setExtractCallback = function(event)
     414  {
     415    var frm = document.forms['bioAssay'];
     416    var list = frm.extract_id;
     417    if (list.length < 2 || list[1].value == '0') // >
     418    {
     419      Forms.addListOption(list, 1, new Option());
     420    }
     421    list[1].value = event.detail.id;
     422    list[1].text = event.detail.name;
     423    list.selectedIndex = 1;
     424  }
     425 
    115426  return bioassays;
    116427}();
  • trunk/www/views/derivedbioassays/edit_bioassay.jsp

    r6297 r6314  
    5353  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
    5454  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
     55  import="net.sf.basedb.util.json.JsonUtil"
     56  import="net.sf.basedb.util.json.NameableConverter"
     57  import="org.json.simple.JSONObject"
    5558  import="java.util.Date"
    5659  import="java.util.List"
     
    238241  subtypesQuery.include(Include.ALL);
    239242
    240  
     243  // Load parent physical bioassays
     244  JSONObject jsonPhysicalBioAssays = new JSONObject();
     245  jsonPhysicalBioAssays.put("itemType", "PHYSICALBIOASSAY");
     246  if (physicalQuery != null)
     247  {
     248    physicalQuery.include(Include.ALL);
     249    physicalQuery.order(Orders.asc(Hql.property("name")));
     250    jsonPhysicalBioAssays.put("items", JsonUtil.toArray(physicalQuery.iterate(dc), new NameableConverter()));
     251  }
     252
     253  // Load parent derived bioassays
     254  JSONObject jsonParents = new JSONObject();
     255  jsonParents.put("itemType", "DERIVEDBIOASSAY");
     256  if (parentQuery != null)
     257  {
     258    parentQuery.include(Include.ALL);
     259    parentQuery.order(Orders.asc(Hql.property("name")));
     260    ItemResultList<DerivedBioAssay> parents = parentQuery.list(dc);
     261    jsonParents.put("items", JsonUtil.toArray(parents, new NameableConverter()));
     262    if (parents.size() == 1 && currentExtract == null)
     263    {
     264      try
     265      {
     266        currentExtract = parents.get(0).getExtract();
     267      }
     268      catch (PermissionDeniedException ex)
     269      {}
     270    }
     271  }
    241272 
    242273  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), bioAssay);
    243274  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
    244275  %>
    245   <base:page type="popup" title="<%=title%>">
    246   <base:head scripts="tabcontrol.js,platforms.js,subtypes.js,linkitems.js" styles="tabcontrol.css">
     276  <base:page type="popup" title="<%=title%>" id="edit-page">
     277  <base:head scripts="tabcontrol-2.js,subtypes.js,linkitems-2.js,~bioassays.js" styles="tabcontrol.css">
    247278    <ext:scripts context="<%=jspContext%>" />
    248279    <ext:stylesheets context="<%=jspContext%>" />
    249     <script>
    250     // Validate the "BioAssay" tab
    251     function validateBioAssay()
    252     {
    253       var frm = document.forms['bioAssay'];
    254       if (Main.trimString(frm.name.value) == '')
    255       {
    256         Forms.showNotification(frm.name, 'You must enter a name');
    257         return false;
    258       }
    259       return true;
    260     }
    261 
    262     // Submit the form
    263     function saveSettings()
    264     {
    265       var frm = document.forms['bioAssay'];
    266       if (TabControl.validateActiveTab('settings'))
    267       {
    268         Annotations.saveModifiedAnnotationsToForm(frm);
    269         Annotations.saveInheritedAnnotationsToForm(frm);
    270         DataFiles.writeFileActionsToForm(frm);
    271         if (frm.addedPhysicalBioAssays)
    272         {
    273           frm.addedPhysicalBioAssays.value = Link.getActionIds(1, 'P').join(',');
    274           frm.removedPhysicalBioAssays.value = Link.getActionIds(-1, 'P').join(',');
    275         }
    276         if (frm.addedParents)
    277         {
    278           frm.addedParents.value = Link.getActionIds(1, 'D').join(',');
    279           frm.removedParents.value = Link.getActionIds(-1, 'D').join(',');
    280         }
    281         frm.submit();
    282       }
    283     }
    284    
    285     function loadAnnotationsFrame()
    286     {
    287       Annotations.autoLoadEditFrame(getProtocolId(), ItemSubtype.getSubtypeId('subtype_id'));
    288     }
    289    
    290     function loadInheritedAnnotationsFrame()
    291     {
    292       Annotations.autoLoadInheritFrame(getParents());
    293     }
    294 
    295     function loadDataFilesFrame()
    296     {
    297       var subtypeId = ItemSubtype.getSubtypeId('subtype_id');
    298       DataFiles.autoLoadEditFrame(0, 0, subtypeId);
    299     }
    300      
    301     function getProtocolId()
    302     {
    303       var frm = document.forms['bioAssay'];
    304       var protocolId = 0;
    305       if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
    306       {
    307         protocolId = Math.abs(parseInt(frm.protocol_id[frm.protocol_id.selectedIndex].value));       
    308       }
    309       return protocolId;
    310     }
    311    
    312     function getParents()
    313     {
    314       var frm = document.forms['bioAssay'];
    315      
    316       var parents = new Array();
    317       if (frm.physicalBioAssays && (!frm.isRoot || frm.isRoot[0].checked))
    318       {
    319         var ids = Link.getListIds(frm.physicalBioAssays, 'P');
    320         if (ids.length > 0)
    321         {
    322           parents[parents.length] = 'PHYSICALBIOASSAY:'+ids.join(':');
    323         }
    324       }
    325       else if (frm.parents && (!frm.isRoot || frm.isRoot[1].checked))
    326       {
    327         var ids = Link.getListIds(frm.parents, 'D');
    328         if (ids.length > 0)
    329         {
    330           parents[parents.length] = 'DERIVEDBIOASSAY:'+ids.join(':');
    331         }
    332       }
    333       var extractId = Math.abs(parseInt(frm.extract_id[frm.extract_id.selectedIndex].value));
    334       if (extractId > 0) parents[parents.length] = 'EXTRACT:'+extractId;
    335       return parents;
    336     }
    337    
    338     function subtypeOnChange()
    339     {
    340       var frm = document.forms['bioAssay'];
    341       var subtypeId = ItemSubtype.getSubtypeId('subtype_id');
    342       var recentInfo = ItemSubtype.getRelatedProjectDefaultAndRecentItems('DERIVEDBIOASSAY', subtypeId, ['PROTOCOL', 'HARDWARE', 'SOFTWARE']);
    343       ItemSubtype.updateSelectionList(frm.protocol_id, recentInfo.PROTOCOL['recent'], recentInfo.PROTOCOL['default']);
    344       ItemSubtype.updateSelectionList(frm.hardware_id, recentInfo.HARDWARE['recent'], recentInfo.HARDWARE['default']);
    345       ItemSubtype.updateSelectionList(frm.software_id, recentInfo.SOFTWARE['recent'], recentInfo.SOFTWARE['default']);
    346     }
    347 
    348    
    349     function selectProtocolOnClick()
    350     {
    351       var frm = document.forms['bioAssay'];
    352       var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
    353       url += '&callback=setProtocolCallback&resetTemporary=1';
    354       url += ItemSubtype.createRelatedFilter('subtype_id', 'PROTOCOL');
    355       if (frm.protocol_id.length > 1)
    356       {
    357         var id = Math.abs(parseInt(frm.protocol_id[1].value));       
    358         url += '&item_id='+id;
    359       }
    360       Main.openPopup(url, 'SelectProtocol', 1050, 700);
    361     }
    362     function setProtocolCallback(id, name)
    363     {
    364       var frm = document.forms['bioAssay'];
    365       var list = frm.protocol_id;
    366       if (list.length < 2 || list[1].value == '0') // >
    367       {
    368         Forms.addListOption(list, 1, new Option());
    369       }
    370       list[1].value = id;
    371       list[1].text = name;
    372       list.selectedIndex = 1;
    373     }
    374    
    375     function selectHardwareOnClick()
    376     {
    377       var frm = document.forms['bioAssay'];
    378       var url = '../../admin/hardware/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
    379       url += '&callback=setHardwareCallback&resetTemporary=1';
    380       url += ItemSubtype.createRelatedFilter('subtype_id', 'HARDWARE');
    381       if (frm.hardware_id.length > 1)
    382       {
    383         var id = Math.abs(parseInt(frm.hardware_id[1].value));       
    384         url += '&item_id='+id;
    385       }
    386       Main.openPopup(url, 'SelectHardware', 1050, 700);
    387     }
    388     function setHardwareCallback(id, name)
    389     {
    390       var frm = document.forms['bioAssay'];
    391       var list = frm.hardware_id;
    392       if (list.length < 2 || list[1].value == '0') // >
    393       {
    394         Forms.addListOption(list, 1, new Option());
    395       }
    396       list[1].value = id;
    397       list[1].text = name;
    398       list.selectedIndex = 1;
    399     }
    400     function selectSoftwareOnClick()
    401     {
    402       var frm = document.forms['bioAssay'];
    403       var url = '../../admin/software/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
    404       url += '&callback=setSoftwareCallback&resetTemporary=1';
    405       url += ItemSubtype.createRelatedFilter('subtype_id', 'SOFTWARE');
    406       if (frm.software_id.length > 1)
    407       {
    408         var id = Math.abs(parseInt(frm.software_id[1].value));       
    409         url += '&item_id='+id;
    410       }
    411       Main.openPopup(url, 'SelectSoftware', 1050, 700);
    412     }
    413     function setSoftwareCallback(id, name)
    414     {
    415       var frm = document.forms['bioAssay'];
    416       var list = frm.software_id;
    417       if (list.length < 2 || list[1].value == '0') // >
    418       {
    419         Forms.addListOption(list, 1, new Option());
    420       }
    421       list[1].value = id;
    422       list[1].text = name;
    423       list.selectedIndex = 1;
    424     }
    425    
    426     function selectExtractOnClick()
    427     {
    428       var frm = document.forms['bioAssay'];
    429      
    430       var relatedExtractIds = null;
    431       if (frm.physicalBioAssays && (!frm.isRoot || frm.isRoot[0].checked))
    432       {
    433         var ids = Link.getListIds(frm.physicalBioAssays, 'P');
    434         if (ids.length > 0)
    435         {
    436           var request = Ajax.getXmlHttpRequest();
    437           var url = '../physicalbioassays/ajax.jsp?ID=<%=ID%>&cmd=GetAllExtractIds';
    438           url += '&bioassay_ids=' + ids.join(',');
    439           request.open("GET", url, false);
    440           request.send(null);
    441                    
    442           var response = JSON.parse(request.responseText);
    443           if (response.status != 'ok')
    444           {
    445             alert(response.message);
    446             return null;
    447           }
    448           relatedExtractIds = response.allExtractIds;
    449         }
    450       }
    451       else if (frm.parents && (!frm.isRoot || frm.isRoot[1].checked))
    452       {
    453         var ids = Link.getListIds(frm.parents, 'D');
    454         if (ids.length > 0)
    455         {
    456           var request = Ajax.getXmlHttpRequest();
    457           var url = 'ajax.jsp?ID=<%=ID%>&cmd=GetAllExtractIds';
    458           url += '&bioassay_ids=' + ids.join(',');
    459           request.open("GET", url, false);
    460           request.send(null);
    461                    
    462           var response = JSON.parse(request.responseText);
    463           if (response.status != 'ok')
    464           {
    465             alert(response.message);
    466             return null;
    467           }
    468           relatedExtractIds = response.allExtractIds;
    469         }
    470       }
    471 
    472       var url = '../../biomaterials/extracts/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
    473       url += '&callback=setExtractCallback&resetTemporary=1';
    474       if (relatedExtractIds)
    475       {
    476         url += '&tmpfilter:INT:id='+relatedExtractIds.join('|');
    477       }
    478       url += ItemSubtype.createRelatedFilter('subtype_id', 'EXTRACT');
    479       if (frm.extract_id.length > 1)
    480       {
    481         var id = Math.abs(parseInt(frm.extract_id[1].value));       
    482         url += '&item_id='+id;
    483       }
    484       Main.openPopup(url, 'SelectExtract', 1050, 700);
    485     }
    486 
    487     function setExtractCallback(id, name)
    488     {
    489       var frm = document.forms['bioAssay'];
    490       var list = frm.extract_id;
    491       if (list.length < 2 || list[1].value == '0') // >
    492       {
    493         Forms.addListOption(list, 1, new Option());
    494       }
    495       list[1].value = id;
    496       list[1].text = name;
    497       list.selectedIndex = 1;
    498     }
    499    
    500     function addPhysicalBioAssayOnClick()
    501     {
    502       var frm = document.forms['bioAssay'];
    503       var url = '../physicalbioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple';
    504       url += '&callback=addPhysicalBioAssayCallback&resetTemporary=1';
    505       url += ItemSubtype.createRelatedFilter('subtype_id', 'PHYSICALBIOASSAY');
    506       Main.openPopup(url, 'AddPhysicalBioAssay', 1050, 700);
    507     }
    508    
    509     function addPhysicalBioAssayCallback(pbaId, name)
    510     {
    511       var frm = document.forms['bioAssay'];
    512       var item = Link.getItem('P', pbaId);
    513       if (!item) item = new Item('P', pbaId, name);
    514       Link.addItem(frm.physicalBioAssays, item);
    515     }
    516 
    517     function removePhysicalBioAssayOnClick()
    518     {
    519       Link.removeSelected(document.forms['bioAssay'].physicalBioAssays);
    520     }
    521 
    522    
    523     function addParentOnClick()
    524     {
    525       var frm = document.forms['bioAssay'];
    526       var url = 'index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple';
    527       url += '&callback=addParentCallback&resetTemporary=1';
    528       url += ItemSubtype.createRelatedFilter('subtype_id', 'DERIVEDBIOASSAY');
    529       Main.openPopup(url, 'AddParentBioAssay', 1050, 700);
    530     }
    531    
    532     function addParentCallback(dbaId, name)
    533     {
    534       var frm = document.forms['bioAssay'];
    535       var item = Link.getItem('D', dbaId);
    536       if (!item) item = new Item('D', dbaId, name);
    537       Link.addItem(frm.parents, item);
    538     }
    539 
    540     function removeParentOnClick()
    541     {
    542       Link.removeSelected(document.forms['bioAssay'].parents);
    543     }
    544 
    545    
    546     function init()
    547     {
    548       var frm = document.forms['bioAssay'];
    549       <%
    550       if (bioAssay == null)
    551       {
    552         %>
    553         frm.name.focus();
    554         frm.name.select();
    555         <%
    556       }
    557       %>
    558       initParents();
    559       initPhysicalBioAssays();
    560       if (frm.isRoot)
    561       {
    562         isRootOnChange();
    563       }
    564     }
    565    
    566     function initPhysicalBioAssays()
    567     {
    568       var physicalBioAssays = document.forms['bioAssay'].physicalBioAssays;
    569       <%
    570       if (physicalQuery != null)
    571       {
    572         physicalQuery.include(Include.ALL);
    573         physicalQuery.order(Orders.asc(Hql.property("name")));
    574         ItemResultList<PhysicalBioAssay> physicalBioAssays = physicalQuery.list(dc);
    575         for (PhysicalBioAssay pba : physicalBioAssays)
    576         {
    577           if (bioAssay != null)
    578           {
    579             %>
    580             Link.addNewItem(physicalBioAssays, new Item('P', <%=pba.getId()%>, '<%=HTML.javaScriptEncode(pba.getName())%>'));
    581             <%
    582           }
    583           else
    584           {
    585             %>
    586             Link.addItem(physicalBioAssays, new Item('P', <%=pba.getId()%>, '<%=HTML.javaScriptEncode(pba.getName())%>'));
    587             <%
    588           }
    589         }
    590       }
    591       %>
    592     }
    593    
    594     function initParents()
    595     {
    596       var parents = document.forms['bioAssay'].parents;
    597       <%
    598       if (parentQuery != null)
    599       {
    600         parentQuery.include(Include.ALL);
    601         parentQuery.order(Orders.asc(Hql.property("name")));
    602         ItemResultList<DerivedBioAssay> parents = parentQuery.list(dc);
    603         for (DerivedBioAssay dba : parents)
    604         {
    605           if (bioAssay != null)
    606           {
    607             %>
    608             Link.addNewItem(parents, new Item('D', <%=dba.getId()%>, '<%=HTML.javaScriptEncode(dba.getName())%>'));
    609             <%
    610           }
    611           else
    612           {
    613             %>
    614             Link.addItem(parents, new Item('D', <%=dba.getId()%>, '<%=HTML.javaScriptEncode(dba.getName())%>'));
    615             <%
    616           }
    617           if (parents.size() == 1 && currentExtract == null)
    618           {
    619             try
    620             {
    621               currentExtract = dba.getExtract();
    622             }
    623             catch (PermissionDeniedException ex)
    624             {}
    625           }
    626         }
    627       }
    628       %>
    629     }
    630    
    631     function isRootOnChange()
    632     {
    633       var frm = document.forms['bioAssay'];
    634       var isRoot = frm.isRoot[0].checked;
    635       Main.showHide('physicalBioAssaySection', isRoot);
    636       Main.showHide('parentBioAssaySection', !isRoot);
    637     }
    638 
    639     </script>
    640280  </base:head>
    641   <base:body onload="init()">
     281  <base:body>
    642282    <h1><%=title%> <base:help tabcontrol="settings" /></h1>
    643283    <form action="index.jsp?ID=<%=ID%>" method="post" name="bioAssay">
     
    648288      position="bottom" active="<%=tabId%>" remember="<%=tabId == null && bioAssay != null%>"
    649289      extensions="<%=invoker%>">
    650     <t:tab id="info" title="Bioassay" validate="validateBioAssay()" helpid="derivedbioassay.edit">
     290    <t:tab id="info" title="Bioassay" helpid="derivedbioassay.edit">
    651291      <table class="fullform input100">
    652292      <tr>
    653293        <th>Name</th>
    654         <td><input class="text required" type="text" name="name"
     294        <td><input class="text required auto-init" data-auto-init="<%=bioAssay == null ? "focus-select" : "focus" %>"
     295          type="text" name="name"
    655296          value="<%=HTML.encodeTags(bioAssay == null ? Values.getString(cc.getPropertyValue("name"), "New derived bioassay") : bioAssay.getName())%>"
    656297          maxlength="<%=DerivedBioAssay.MAX_NAME_LENGTH%>"></td>
    657298        <td></td>
    658299      </tr>
    659 
    660300      <tr>
    661301        <th>Type</th>
    662302        <td>
    663303          <select name="subtype_id" id="subtype_id"
    664             <%=!readCurrentSubtype ? "disabled readonly class=\"disabled selectionlist\"" : "class=\"selectionlist\""%>
    665             onchange="subtypeOnChange()"
    666             >
     304            <%=!readCurrentSubtype ? "disabled readonly class=\"disabled selectionlist\"" : "class=\"selectionlist\""%>>
    667305          <%
    668306          if (!readCurrentSubtype)
     
    704342            <input id="isRoot" type="radio" name="isRoot" value="1"
    705343              <%=parentType == Item.PHYSICALBIOASSAY ? "checked" : "" %>
    706               onchange="isRootOnChange()"><label for="isRoot">Physical bioassay</label>
     344              ><label for="isRoot">Physical bioassay</label>
    707345            <input id="isChild" type="radio" name="isRoot" value="0"
    708346              <%=parentType != Item.PHYSICALBIOASSAY ? "checked" : "" %>
    709               onchange="isRootOnChange()"><label for="isChild">Derived bioassay</label><br>
     347              ><label for="isChild">Derived bioassay</label><br>
    710348          </td>
    711349          <td></td>
     
    725363            <tr>
    726364            <td>
    727               <select name="physicalBioAssays" size="4" multiple>
     365              <select name="physicalBioAssays" id="physicalBioAssays"
     366                class="auto-init"
     367                data-auto-init="link-container"
     368                data-initial-items="[<%=HTML.encodeTags(jsonPhysicalBioAssays.toJSONString()) %>]"
     369                data-initial-action="<%=bioAssay == null ? 1 : 0 %>"
     370                size="4" multiple>
    728371              </select>
    729372            </td>
     
    732375              <base:buttongroup vertical="true">
    733376                <base:button
     377                  id="btnAddPhysicalBioAssays"
    734378                  subclass="leftaligned"
    735379                  style="width: 12em;"
    736                   onclick="addPhysicalBioAssayOnClick()"
    737380                  title="Add&nbsp;bioassays&hellip;"
    738381                  tooltip="Add physical bioassays"
    739382                />
    740383                <base:button
    741                   subclass="leftaligned"
     384                  subclass="leftaligned auto-init"
     385                  data-auto-init="remove-link"
     386                  data-list-id="physicalBioAssays"
    742387                  style="width: 12em;"
    743                   onclick="removePhysicalBioAssayOnClick()"
    744388                  title="Remove"
    745389                  tooltip="Remove the selected physical bioassays"
    746390                />
    747391              </base:buttongroup>
    748               <input type="hidden" name="addedPhysicalBioAssays" value="">
    749               <input type="hidden" name="removedPhysicalBioAssays" value="">
    750392            </td>
    751393            </tr>
     
    767409            <tr>
    768410            <td>
    769               <select name="parents" size="4" multiple>
     411              <select name="parents" id="parents"
     412                class="auto-init"
     413                data-auto-init="link-container"
     414                data-initial-items="[<%=HTML.encodeTags(jsonParents.toJSONString()) %>]"
     415                data-initial-action="<%=bioAssay == null ? 1 : 0 %>"
     416                size="4" multiple>
    770417              </select>
    771418            </td>
     
    774421              <base:buttongroup vertical="true">
    775422                <base:button
     423                  id="btnAddParents"
    776424                  subclass="leftaligned"
    777425                  style="width: 12em;"
    778                   onclick="addParentOnClick()"
    779426                  title="Add&nbsp;bioassays&hellip;"
    780427                  tooltip="Add parent derived bioassays"
    781428                />
    782429                <base:button
    783                   subclass="leftaligned"
     430                  subclass="leftaligned auto-init"
     431                  data-auto-init="remove-link"
     432                  data-list-id="parents"
    784433                  style="width: 12em;"
    785                   onclick="removeParentOnClick()"
    786434                  title="Remove"
    787435                  tooltip="Remove the selected derived bioassays"
    788436                />
    789437              </base:buttongroup>
    790               <input type="hidden" name="addedParents" value="">
    791               <input type="hidden" name="removedParents" value="">
    792438            </td>
    793439            </tr>
     
    811457            denied="<%=!readCurrentExtract%>"
    812458            newitem="<%=bioAssay == null%>"
    813             onselect="selectExtractOnClick()"
    814459          />
    815460        </td>
     
    828473            defaultitems="<%=defaultProtocols%>"
    829474            newitem="<%=bioAssay == null%>"
    830             onselect="selectProtocolOnClick()"
    831475          />
    832476        </td>
     
    845489            defaultitems="<%=defaultHardware%>"
    846490            newitem="<%=bioAssay == null%>"
    847             onselect="selectHardwareOnClick()"
    848491          />
    849492        </td>
     
    862505            defaultitems="<%=defaultSoftware%>"
    863506            newitem="<%=bioAssay == null%>"
    864             onselect="selectSoftwareOnClick()"
    865507          />
    866508        </td>
     
    881523    </t:tab>
    882524
    883     <t:tab id="datafiles" title="Data files" helpid="datafiles.edit" activate="loadDataFilesFrame()">
     525    <t:tab id="datafiles" title="Data files" helpid="datafiles.edit">
    884526      <jsp:include page="../../common/datafiles/select_frameset.jsp">
    885527        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    889531    </t:tab>
    890532
    891     <t:tab id="annotations" title="Annotations &amp; parameters" helpid="annotations.edit" activate="loadAnnotationsFrame()">
     533    <t:tab id="annotations" title="Annotations &amp; parameters" helpid="annotations.edit">
    892534      <jsp:include page="../../common/annotations/annotate_frameset.jsp">
    893535        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    898540   
    899541    <t:tab id="inheritedAnnotations" title="Inherited annotations"
    900       helpid="annotations.edit.inherited" activate="loadInheritedAnnotationsFrame()">
     542      helpid="annotations.edit.inherited">
    901543      <jsp:include page="../../common/annotations/inherit_frameset.jsp">
    902544        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    916558
    917559    <base:buttongroup subclass="dialogbuttons">
    918       <base:button onclick="saveSettings()" title="Save" />
    919       <base:button onclick="window.close()" title="Cancel" />
     560      <base:button id="btnSave" title="Save" />
     561      <base:button id="close" title="Cancel" />
    920562    </base:buttongroup>
    921563
  • trunk/www/views/derivedbioassays/index.jsp

    r6192 r6314  
    258258      {
    259259        // A root derived bioassay set may have physical bioassays as parents
    260         String[] removePhysicalBioAssays = Values.getString(request.getParameter("removedPhysicalBioAssays")).split(",");
     260        String[] removePhysicalBioAssays = Values.getString(request.getParameter("-PHYSICALBIOASSAY")).split(",");
    261261        for (int i = 0; i < removePhysicalBioAssays.length; ++i)
    262262        {
     
    265265        }
    266266       
    267         String[] addPhysicalBioAssays = Values.getString(request.getParameter("addedPhysicalBioAssays")).split(",");
     267        String[] addPhysicalBioAssays = Values.getString(request.getParameter("+PHYSICALBIOASSAY")).split(",");
    268268        for (int i = 0; i < addPhysicalBioAssays.length; ++i)
    269269        {
     
    275275      {
    276276        // A non-root derived bioassay set may have other derived bioassays as parents
    277         String[] removeParents = Values.getString(request.getParameter("removedParents")).split(",");
     277        String[] removeParents = Values.getString(request.getParameter("-DERIVEDBIOASSAY")).split(",");
    278278        for (int i = 0; i < removeParents.length; ++i)
    279279        {
     
    282282        }
    283283       
    284         String[] addParents = Values.getString(request.getParameter("addedParents")).split(",");
     284        String[] addParents = Values.getString(request.getParameter("+DERIVEDBIOASSAY")).split(",");
    285285        for (int i = 0; i < addParents.length; ++i)
    286286        {
  • trunk/www/views/formulas/edit_formula.jsp

    r6217 r6314  
    120120  {
    121121    formula = Formula.getById(dc, itemId);
     122    formula.checkPermission(Permission.WRITE);
    122123    currentParser = formula.getParser();
    123124    currentAverageMethod = formula.getAverageMethod();
     
    132133    title = "Edit formula -- " + HTML.encodeTags(formula.getName());
    133134  }
    134   if (formula != null) formula.checkPermission(Permission.WRITE);
    135  
    136  
    137  
    138135  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), formula);
    139136  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
    140137  %>
    141   <base:page type="popup" title="<%=title%>">
    142   <base:head scripts="tabcontrol.js" styles="tabcontrol.css">
     138  <base:page type="popup" title="<%=title%>" id="edit-page">
     139  <base:head scripts="tabcontrol-2.js,~formulas.js" styles="tabcontrol.css">
    143140    <ext:scripts context="<%=jspContext%>" />
    144141    <ext:stylesheets context="<%=jspContext%>" />
    145     <script>
    146     // Validate the "Formula" tab
    147     function validateFormula()
    148     {
    149       var frm = document.forms['formula'];
    150       if (Main.trimString(frm.name.value) == '')
    151       {
    152         Forms.showNotification(frm.name, 'You must enter a name');
    153         return false;
    154       }
    155       var type = frm.type[frm.type.selectedIndex].value;
    156       var numFormulas = frm.expressions.length;
    157       var numChannels = frm.channels.value;
    158       if (type == '<%=Formula.Type.INTENSITY_EXPRESSION.name()%>' || type == '<%=Formula.Type.INTENSITY_TRANSFORMATION.name()%>')
    159       {
    160         // One formula per channel required
    161         if (numFormulas != numChannels)
    162         {
    163           Forms.showNotification(frm.expressions, 'You must enter one formula per channel for type = ' + frm.type[frm.type.selectedIndex].text, null, 'pointer-left');
    164           return false;
    165         }
    166       }
    167       else
    168       {
    169         // Only one formula can be specified
    170         if (numFormulas != 1)
    171         {
    172           Forms.showNotification(frm.expressions, 'You must enter exactly one formula for type = ' + frm.type[frm.type.selectedIndex].text, null, 'pointer-left');
    173           return false;
    174         }
    175       }
    176      
    177       if (frm.use_colors.checked && !frm.use_colors.disabled)
    178       {
    179         var minValue = parseFloat(frm.min_value.value);
    180         var midValue = parseFloat(frm.mid_value.value);
    181         var maxValue = parseFloat(frm.max_value.value);
    182         if (isNaN(minValue))
    183         {
    184           Forms.showNotification(frm.min_value, 'No min value has been specified');
    185           return false;
    186         }
    187         if (isNaN(midValue))
    188         {
    189           Forms.showNotification(frm.mid_value, 'No mid value has been specified');
    190           return false;
    191         }
    192         if (isNaN(maxValue))
    193         {
    194           Forms.showNotification(frm.max_value, 'No max value has been specified');
    195           return false;
    196         }
    197         if (minValue > midValue)
    198         {
    199           Forms.showNotification(frm.mid_value, 'The mid value must be greater than the min value');
    200           return false;
    201         }
    202         if (midValue > maxValue)
    203         {
    204           Forms.showNotification(frm.max_value, 'The max value must be greater than the mid value');
    205           return false;
    206         }
    207       }
    208       return true;
    209     }
    210 
    211     // Submit the form
    212     function saveSettings()
    213     {
    214       var frm = document.forms['formula'];
    215       if (TabControl.validateActiveTab('settings'))
    216       {
    217         for (var i = 0; i < frm.expressions.length; i++)
    218         {
    219           Forms.createHidden(frm, 'formulas', frm.expressions[i].text);
    220         }
    221         frm.channels.disabled = false; // Otherwise the channels info, isn't sent
    222         frm.submit();
    223       }
    224     }
    225    
    226     function init()
    227     {
    228       <%
    229       if (formula == null)
    230       {
    231         %>
    232         var frm = document.forms['formula'];
    233         frm.name.focus();
    234         frm.name.select();
    235         <%
    236       }
    237       %>
    238       formulaTypeOnChange();
    239     }
    240     var rawDataTypes = new Array();
    241     <%
    242     for (RawDataType rdt : RawDataTypes.getRawDataTypes())
    243     {
    244       %>
    245       rawDataTypes['<%=rdt.getId()%>'] = <%=rdt.getChannels()%>;
    246       var a = new Array();
    247       <%
    248       for (RawDataProperty rp : rdt.getProperties())
    249       {
    250         %>
    251         a['<%=rp.getName()%>'] = 1;
    252         <%
    253       }
    254       %>
    255       rawDataTypes['<%=rdt.getId()%>.properties'] = a;
    256       <%
    257     }
    258     %>
    259    
    260     function rawDataTypeOnChange()
    261     {
    262       var frm = document.forms['formula'];
    263       var rdt = frm.rawdatatype[frm.rawdatatype.selectedIndex].value;
    264       if (rdt != '')
    265       {
    266         frm.channels.value = rawDataTypes[rdt];
    267         frm.channels.disabled = true;
    268         Main.addClass(frm.channels, 'disabled');
    269         Main.removeClass(frm.channels, 'required');
    270       }
    271       else
    272       {
    273         frm.channels.disabled = false;
    274         Main.removeClass(frm.channels, 'disabled');
    275         Main.addClass(frm.channels, 'required');
    276       }
    277     }
    278 
    279     var selectedExpressionIndex = -1;
    280     function expressionsOnClick()
    281     {
    282       var frm = document.forms['formula'];
    283       selectedExpressionIndex = frm.expressions.selectedIndex;
    284       frm.expression.value = frm.expressions[selectedExpressionIndex].text;
    285     }
    286 
    287     function expressionOnBlur()
    288     {
    289       var frm = document.forms['formula'];
    290       if (selectedExpressionIndex >= 0)
    291       {
    292         frm.expressions[selectedExpressionIndex].text = frm.expression.value;
    293       }
    294     }
    295    
    296     function removeOnClick()
    297     {
    298       var frm = document.forms['formula'];
    299       if (selectedExpressionIndex >= 0)
    300       {
    301         frm.expressions[selectedExpressionIndex] = null;
    302         selectedExpressionIndex = -1;
    303       }
    304     }
    305    
    306     function addOnClick()
    307     {
    308       var frm = document.forms['formula'];
    309       if (frm.expression.value != '')
    310       {
    311         frm.expressions[frm.expressions.length] = new Option(frm.expression.value);
    312         selectedExpressionIndex = frm.expressions.length - 1;
    313         frm.expressions.selectedIndex = selectedExpressionIndex;
    314       }
    315     }
    316    
    317     function openExpressionBuilder()
    318     {
    319       var frm = document.forms['formula'];
    320       var rdt = frm.rawdatatype[frm.rawdatatype.selectedIndex].value;
    321       var formulaType = frm.type[frm.type.selectedIndex].value;
    322       var channels = frm.channels.value;
    323       var restrictions = formulaType == '<%=Formula.Type.COLUMN_RESTRICTION.name()%>';
    324       Main.expressionBuilder('<%=ID%>', 'Expression', 'formula', 'expression', formulaType, rdt, channels, restrictions, null, 'setExpressionFromBuilder');
    325     }
    326  
    327     function setExpressionFromBuilder(form, textarea, value)
    328     {
    329       var frm = document.forms['formula'];
    330       frm[textarea].value = value;
    331       if (frm.expressions.length == 0)
    332       {
    333         addOnClick();
    334       }
    335       else
    336       {
    337         expressionOnBlur();
    338       }
    339     }
    340  
    341     var useColors = new Array();
    342     var supportsAverage = new Array();
    343     var lockedValueType = new Array();
    344     <%
    345     for (Formula.Type ft : Formula.Type.values())
    346     {
    347       Type vt = ft.getValueType();
    348       %>
    349       useColors['<%=ft.name()%>'] = <%=ft.canUseColoring()%>;
    350       supportsAverage['<%=ft.name()%>'] = <%=ft.supportsAverage()%>;
    351       lockedValueType['<%=ft.name()%>'] = '<%=vt == null ? "" : vt.name()%>';
    352       <%
    353     }
    354     %>
    355  
    356     function useColorsOnClick()
    357     {
    358       var frm = document.forms['formula'];
    359       var useColors = frm.use_colors.checked && !frm.use_colors.disabled;
    360       frm.min_value.disabled = !useColors;
    361       frm.mid_value.disabled = !useColors;
    362       frm.max_value.disabled = !useColors;
    363       frm.logarithmic.disabled = !useColors;
    364       if (useColors)
    365       {
    366         Main.addClass(frm.min_value, 'required');
    367         Main.addClass(frm.mid_value, 'required');
    368         Main.addClass(frm.max_value, 'required');
    369       }
    370       else
    371       {
    372         Main.removeClass(frm.min_value, 'required');
    373         Main.removeClass(frm.mid_value, 'required');
    374         Main.removeClass(frm.max_value, 'required');
    375       }
    376     }
    377    
    378     function formulaTypeOnChange()
    379     {
    380       var frm = document.forms['formula'];
    381       var formulaType = frm.type[frm.type.selectedIndex].value;
    382       var use = useColors[formulaType];
    383       frm.use_colors.disabled = !use;
    384       useColorsOnClick();
    385       var supportsAvg = supportsAverage[formulaType];
    386       frm.averageMethod.disabled = !supportsAvg;
    387       if (!supportsAvg) frm.averageMethod.selectedIndex = 0;
    388       var valueType = lockedValueType[formulaType];
    389       if (valueType)
    390       {
    391         Forms.selectListOption(frm.valueType, valueType);
    392         frm.valueType.disabled = true;
    393       }
    394       else
    395       {
    396         frm.valueType.disabled = false;
    397       }
    398     }
    399     </script>
    400142  </base:head>
    401   <base:body onload="init()">
     143  <base:body >
    402144    <h1><%=title%> <base:help tabcontrol="settings" /></h1>
    403145    <form action="index.jsp?ID=<%=ID%>" method="post" name="formula">
     
    406148    <t:tabcontrol id="settings"
    407149      subclass="content dialogtabcontrol"
    408       position="bottom"  remember="<%=formula != null%>"
     150      position="bottom" remember="<%=formula != null%>"
    409151      extensions="<%=invoker%>">
    410     <t:tab id="info" title="Formula" validate="validateFormula()" helpid="formula.edit">
     152    <t:tab id="info" title="Formula" helpid="formula.edit">
    411153      <table class="fullform input100">
    412154      <tr>
    413155        <th>Name</th>
    414         <td><input class="text required" type="text" name="name"
     156        <td><input class="text required auto-init" data-auto-init="<%=formula == null ? "focus-select" : "focus" %>"
     157          type="text" name="name"
    415158          value="<%=HTML.encodeTags(formula == null ? Values.getString(cc.getPropertyValue("name"), "New formula") : formula.getName())%>"
    416159          maxlength="<%=Formula.MAX_NAME_LENGTH%>"></td>
     
    420163        <th>Type</th>
    421164        <td>
    422           <select name="type" class="required" onchange="formulaTypeOnChange()" style="width: 15em;">
     165          <select name="type" class="required" id="formulaType" style="width: 15em;">
    423166          <%
    424167          for (Formula.Type type : Formula.Type.values())
    425168          {
    426169            String selected = type == currentType ? "selected" : "";
    427             %>
    428             <option value="<%=type.name()%>" <%=selected%>><%=HTML.encodeTags(type.toString())%>
     170            Type valueType = type.getValueType();
     171            %>
     172            <option value="<%=type.name()%>" <%=selected%>
     173              data-supports-colors="<%=type.canUseColoring() ? 1 : 0 %>"
     174              data-supports-average="<%=type.supportsAverage() ? 1 : 0 %>"
     175              data-value-type="<%=valueType == null ? "" : valueType.name() %>"
     176            ><%=HTML.encodeTags(type.toString())%>
    429177            <%
    430178          }
     
    454202        <th>Raw data type</th>
    455203        <td>
    456           <select name="rawdatatype" onchange="rawDataTypeOnChange()" style="width: 15em;">
     204          <select name="rawdatatype" id="rawdatatype" style="width: 15em;">
    457205          <option value="">- none -
    458206          <%
     
    461209            String selected = rdt == currentRawDataType ? "selected" : "";
    462210            %>
    463             <option value="<%=rdt.getId()%>" <%=selected%>><%=HTML.encodeTags(rdt.getName())%>
     211            <option value="<%=rdt.getId()%>" <%=selected%>
     212              data-channels="<%=rdt.getChannels()%>"
     213              ><%=HTML.encodeTags(rdt.getName())%>
    464214            <%
    465215          }
     
    471221      <tr>
    472222        <th>Channels</th>
    473         <td><input <%=currentRawDataType != null ? "class=\"text disabled\" disabled" : "class=\"text required\""%> type="text" name="channels"
     223        <td><input <%=currentRawDataType != null ? "class=\"text disabled\" disabled" : "class=\"text required\""%>
     224          type="text" name="channels" id="channels"
    474225          style="width:15em;"
    475226          value="<%=formula == null ? (currentRawDataType == null ? Values.getInt(cc.getPropertyValue("channels")) : currentRawDataType.getChannels()) : formula.getChannels()%>"
    476            maxlength="10" onkeypress="return Numbers.integerOnly(event)"
     227           maxlength="10"
    477228          ></td>
    478229        <td></td>
     
    484235          <tr>
    485236            <td>
    486             <select name="expressions" size="3" style="width: 26em;"
    487               onchange="expressionsOnClick()" multiple class="required">
     237            <select name="expressions" id="expressions" size="3" style="width: 26em;"
     238              multiple class="required">
    488239              <%
    489240              if (expressions != null)
     
    499250            </select>
    500251            </td>
    501             <td><base:button onclick="removeOnClick()" title="Remove" /></td>
     252            <td><base:button id="btnRemoveExpression" title="Remove" /></td>
    502253            <td></td>
    503254          </tr>
    504255          <tr>
    505256          <td>
    506             <input type="text" name="expression" class="text" style="width: 26em;"
    507               maxlength="<%=Formula.MAX_FORMULA_LENGTH%>"
    508               onblur="expressionOnBlur()">
     257            <input type="text" name="expression" id="expression" class="text" style="width: 26em;"
     258              maxlength="<%=Formula.MAX_FORMULA_LENGTH%>">
    509259          </td>
    510260          <td>
    511             <base:button onclick="addOnClick()" title="Add" />
     261            <base:button id="btnAddExpression" title="Add" />
    512262          </td>
    513263          <td>
    514             <base:button onclick="openExpressionBuilder()"
     264            <base:button
     265              id="btnExpressionBuilder"
    515266              image="expression_builder.png"
    516267              title="Expression builder&hellip;" />
     
    591342        <td>
    592343          <input type="checkbox" name="use_colors" id="useColors" value="1"
    593             <%=coloring.isUsingColors() ? "checked" : "" %>
    594             onclick="useColorsOnClick()">
     344            <%=coloring.isUsingColors() ? "checked" : "" %>>
    595345          <label for="useColors"><b>Use colors</b></label>
    596346         
     
    605355        <td>
    606356          <b>Min value</b>
    607           <input type="text" class="text" name="min_value" style="width: 6em;"
     357          <input type="text" class="text" name="min_value" id="min_value" style="width: 6em;"
    608358             value="<%=Values.formatNumber(coloring.getMinValue(), -1)%>"
    609              maxlength="6" onkeypress="return Numbers.numberOnly(event)">
     359             maxlength="6">
    610360          <b>Mid value</b>
    611           <input type="text" class="text" name="mid_value" style="width: 6em;"
     361          <input type="text" class="text" name="mid_value" id="mid_value" style="width: 6em;"
    612362             value="<%=Values.formatNumber(coloring.getMidValue(), -1)%>"
    613              maxlength="6" onkeypress="return Numbers.numberOnly(event)">
     363             maxlength="6">
    614364          <b>Max value</b>
    615           <input type="text" class="text" name="max_value" style="width: 6em;"
     365          <input type="text" class="text" name="max_value" id="max_value" style="width: 6em;"
    616366             value="<%=Values.formatNumber(coloring.getMaxValue(), -1)%>"
    617              maxlength="6" onkeypress="return Numbers.numberOnly(event)">
     367             maxlength="6">
    618368        </td>
    619369        <td></td>
     
    639389
    640390    <base:buttongroup subclass="dialogbuttons">
    641       <base:button onclick="saveSettings()" title="Save" />
    642       <base:button onclick="window.close()" title="Cancel" />
     391      <base:button id="btnSave" title="Save" />
     392      <base:button id="close" title="Cancel" />
    643393    </base:buttongroup>
    644394  </base:body>
  • trunk/www/views/formulas/formulas.js

    r6311 r6314  
    3535    if (pageId == 'edit-page')
    3636    {
    37       // TODO
     37      // Save + Close buttons
     38      Buttons.addClickHandler('btnSave', formulas.save);
     39      Buttons.addClickHandler('close', App.closeWindow);
     40
     41      // Tab validation
     42      TabControl.addTabValidator('settings.info', formulas.validateFormula);
     43     
     44      // Channels
     45      Events.addEventHandler('channels', 'keypress', Events.integerOnly);
     46
     47      // Color values
     48      Events.addEventHandler('useColors', 'click', formulas.useColorsOnClick);
     49      Events.addEventHandler('min_value', 'keypress', Events.numberOnly);
     50      Events.addEventHandler('mid_value', 'keypress', Events.numberOnly);
     51      Events.addEventHandler('max_value', 'keypress', Events.numberOnly);
     52     
     53      // Raw data type
     54      Events.addEventHandler('rawdatatype', 'change', formulas.rawDataTypeOnChange);
     55     
     56      // Formula type
     57      Events.addEventHandler('formulaType', 'change', formulas.formulaTypeOnChange);
     58      formulas.formulaTypeOnChange();
     59     
     60      // Expressions
     61      Events.addEventHandler('expressions', 'change', formulas.expressionsOnClick);
     62      Events.addEventHandler('expression', 'keyup', formulas.expressionOnBlur);
     63      Events.addEventHandler('expression', 'change', formulas.expressionOnChange);
     64      Buttons.addClickHandler('btnRemoveExpression', formulas.removeOnClick);
     65      Buttons.addClickHandler('btnAddExpression', formulas.addOnClick);
     66      Buttons.addClickHandler('btnExpressionBuilder', formulas.openExpressionBuilder);
     67     
    3868    }
    3969    else if (pageId == 'view-page')
     
    73103  }
    74104 
     105  formulas.validateFormula = function()
     106  {
     107    var frm = document.forms['formula'];
     108    if (Main.trimString(frm.name.value) == '')
     109    {
     110      Forms.showNotification(frm.name, 'You must enter a name');
     111      return false;
     112    }
     113   
     114    var type = frm.type.value;
     115    var numFormulas = frm.expressions.length;
     116    var numChannels = frm.channels.value;
     117    if (type == 'INTENSITY_EXPRESSION' || type == 'INTENSITY_TRANSFORMATION')
     118    {
     119      // One formula per channel required
     120      if (numFormulas != numChannels)
     121      {
     122        Forms.showNotification(frm.expressions, 'You must enter one formula per channel for type = ' + frm.type[frm.type.selectedIndex].text, null, 'pointer-left');
     123        return false;
     124      }
     125    }
     126    else
     127    {
     128      // Only one formula can be specified
     129      if (numFormulas != 1)
     130      {
     131        Forms.showNotification(frm.expressions, 'You must enter exactly one formula for type = ' + frm.type[frm.type.selectedIndex].text, null, 'pointer-left');
     132        return false;
     133      }
     134    }
     135   
     136    if (frm.use_colors.checked && !frm.use_colors.disabled)
     137    {
     138      var minValue = parseFloat(frm.min_value.value);
     139      var midValue = parseFloat(frm.mid_value.value);
     140      var maxValue = parseFloat(frm.max_value.value);
     141      if (isNaN(minValue))
     142      {
     143        Forms.showNotification(frm.min_value, 'No min value has been specified');
     144        return false;
     145      }
     146      if (isNaN(midValue))
     147      {
     148        Forms.showNotification(frm.mid_value, 'No mid value has been specified');
     149        return false;
     150      }
     151      if (isNaN(maxValue))
     152      {
     153        Forms.showNotification(frm.max_value, 'No max value has been specified');
     154        return false;
     155      }
     156      if (minValue > midValue)
     157      {
     158        Forms.showNotification(frm.mid_value, 'The mid value must be greater than the min value');
     159        return false;
     160      }
     161      if (midValue > maxValue)
     162      {
     163        Forms.showNotification(frm.max_value, 'The max value must be greater than the mid value');
     164        return false;
     165      }
     166    }
     167    return true;
     168  }
     169
     170  formulas.save = function()
     171  {
     172    var frm = document.forms['formula'];
     173    if (TabControl.validateActiveTab('settings'))
     174    {
     175      for (var i = 0; i < frm.expressions.length; i++)
     176      {
     177        Forms.createHidden(frm, 'formulas', frm.expressions[i].text);
     178      }
     179      frm.channels.disabled = false; // Otherwise the channels info, isn't sent
     180      frm.submit();
     181    }
     182  }
     183 
     184  formulas.useColorsOnClick = function()
     185  {
     186    var frm = document.forms['formula'];
     187    var useColors = frm.use_colors.checked && !frm.use_colors.disabled;
     188    frm.min_value.disabled = !useColors;
     189    frm.mid_value.disabled = !useColors;
     190    frm.max_value.disabled = !useColors;
     191    frm.logarithmic.disabled = !useColors;
     192    if (useColors)
     193    {
     194      Main.addClass(frm.min_value, 'required');
     195      Main.addClass(frm.mid_value, 'required');
     196      Main.addClass(frm.max_value, 'required');
     197    }
     198    else
     199    {
     200      Main.removeClass(frm.min_value, 'required');
     201      Main.removeClass(frm.mid_value, 'required');
     202      Main.removeClass(frm.max_value, 'required');
     203    }
     204  }
     205
     206  formulas.rawDataTypeOnChange = function()
     207  {
     208    var frm = document.forms['formula'];
     209    var rawDataType = frm.rawdatatype[frm.rawdatatype.selectedIndex];
     210    if (rawDataType.value != '')
     211    {
     212      frm.channels.value = Data.get(rawDataType, 'channels');
     213      frm.channels.disabled = true;
     214      Main.addClass(frm.channels, 'disabled');
     215      Main.removeClass(frm.channels, 'required');
     216    }
     217    else
     218    {
     219      frm.channels.disabled = false;
     220      Main.removeClass(frm.channels, 'disabled');
     221      Main.addClass(frm.channels, 'required');
     222    }
     223  }
     224
     225  formulas.formulaTypeOnChange = function()
     226  {
     227    var frm = document.forms['formula'];
     228    var formulaType = frm.type[frm.type.selectedIndex];
     229   
     230    // Enable/disable colors
     231    frm.use_colors.disabled = Data.int(formulaType, 'supports-colors');
     232    formulas.useColorsOnClick();
     233   
     234    // Enable/disable average method
     235    var supportsAvg = Data.int(formulaType, 'supports-average');
     236    frm.averageMethod.disabled = !supportsAvg;
     237    if (!supportsAvg) frm.averageMethod.selectedIndex = 0;
     238   
     239    // Value type
     240    var valueType = Data.get(formulaType, 'value-type');
     241    if (valueType)
     242    {
     243      Forms.selectListOption(frm.valueType, valueType);
     244      frm.valueType.disabled = true;
     245    }
     246    else
     247    {
     248      frm.valueType.disabled = false;
     249    }
     250  }
     251
     252  formulas.expressionsOnClick = function()
     253  {
     254    var frm = document.forms['formula'];
     255    var selectedExpressionIndex = frm.expressions.selectedIndex;
     256    if (selectedExpressionIndex >= 0)
     257    {
     258      frm.expression.value = frm.expressions[selectedExpressionIndex].text;
     259      Data.set(frm.expression, 'linked-index', selectedExpressionIndex);
     260    }
     261  }
     262 
     263  formulas.expressionOnBlur = function()
     264  {
     265    var frm = document.forms['formula'];
     266    var selectedExpressionIndex = Data.int(frm.expression, 'linked-index', -1);
     267    if (selectedExpressionIndex >= 0)
     268    {
     269      frm.expressions[selectedExpressionIndex].text = frm.expression.value;
     270    }
     271  }
     272 
     273  formulas.removeOnClick = function()
     274  {
     275    var frm = document.forms['formula'];
     276    for (var i = frm.expressions.length-1; i >= 0; i--)
     277    {
     278      if (frm.expressions[i].selected) frm.expressions[i] = null;
     279    }
     280    frm.expression.value = '';
     281    Data.set(frm.expression, 'linked-index', -1);
     282  }
     283 
     284  formulas.addOnClick = function()
     285  {
     286    var frm = document.forms['formula'];
     287    if (frm.expression.value != '')
     288    {
     289      frm.expressions[frm.expressions.length] = new Option(frm.expression.value);
     290      frm.expressions.selectedIndex = frm.expressions.length - 1;
     291      Data.set(frm.expression, 'linked-index', frm.expressions.selectedIndex);
     292    }
     293  }
     294
     295  formulas.openExpressionBuilder = function()
     296  {
     297    var frm = document.forms['formula'];
     298    var rdt = frm.rawdatatype.value;
     299    var formulaType = frm.type.value;
     300    var channels = frm.channels.value;
     301    var restrictions = formulaType == 'COLUMN_RESTRICTION';
     302    Dialogs.openExpressionBuilder('expression', 'Expression', formulaType, rdt, channels)
     303  }
     304
     305
     306  formulas.expressionOnChange = function(event)
     307  {
     308    var frm = document.forms['formula'];
     309    if (frm.expressions.length == 0)
     310    {
     311      formulas.addOnClick();
     312    }
     313    else
     314    {
     315      formulas.expressionOnBlur();
     316    }
     317  }
     318
    75319  return formulas;
    76320}();
  • trunk/www/views/physicalbioassays/bioassays.js

    r6311 r6314  
    3535    if (pageId == 'edit-page')
    3636    {
    37       // TODO
     37      // Save + Close buttons
     38      Buttons.addClickHandler('btnSave', bioassays.save);
     39      Buttons.addClickHandler('close', App.closeWindow);
     40
     41      // Tab validation
     42      TabControl.addTabActivateListener('settings.annotations', bioassays.loadAnnotationsFrame);
     43      TabControl.addTabActivateListener('settings.inheritedAnnotations', bioassays.loadInheritedAnnotationsFrame);
     44      TabControl.addTabValidator('settings.info', bioassays.validatePhysicalBioAssay);
     45     
     46      // Size
     47      Events.addEventHandler('size', 'keypress', Events.integerOnly);
     48     
     49      // Protocol
     50      Buttons.addClickHandler('protocol_id.select', bioassays.selectProtocol);
     51      Events.addEventHandler('protocol_id', 'base-selected', bioassays.setProtocolCallback);
     52
     53      // Subtype
     54      Events.addEventHandler('subtype_id', 'change', bioassays.subtypeOnChange);
     55
     56      // Hardware
     57      Buttons.addClickHandler('hardware_id.select', bioassays.selectHardware);
     58      Events.addEventHandler('hardware_id', 'base-selected', bioassays.setHardwareCallback);
     59     
     60      // Array slide
     61      Buttons.addClickHandler('arrayslide_id.select', bioassays.selectArraySlide);
     62      Events.addEventHandler('arrayslide_id', 'base-selected', bioassays.setArraySlideCallback);
     63      Events.addEventHandler('arrayslide_id', 'change', bioassays.arraySlideOnChange);
     64     
     65      // Parent extracts
     66      Events.addEventHandler('extracts', 'change', bioassays.extractsOnChange);
     67      Buttons.addClickHandler('btnAddExtracts', bioassays.addExtracts);
     68      Events.addEventHandler('btnAddExtracts', 'base-selected', bioassays.addExtractCallback);
     69     
     70      // Used quantity and position
     71      Events.addEventHandler('used_quantity', 'keypress', Events.numberOnly);
     72      Events.addEventHandler('used_quantity', 'keyup', bioassays.usedQuantityOnBlur);
     73      Events.addEventHandler('position', 'keypress', Events.integerOnly);
     74      Events.addEventHandler('position', 'keyup', bioassays.usedQuantityOnBlur);
    3875    }
    3976    else if (pageId == 'view-page')
     
    100137    Main.viewOrEditItem(App.getSessionId(), 'DERIVEDBIOASSAY', 0, true, '&physicalbioassay_id='+parentId);
    101138  }
    102 
     139 
     140  bioassays.validatePhysicalBioAssay = function()
     141  {
     142    var frm = document.forms['bioassay'];
     143    if (Main.trimString(frm.name.value) == '')
     144    {
     145      Forms.showNotification(frm.name, 'You must enter a name');
     146      return false;
     147    }
     148    else if (!Numbers.isInteger(frm.size.value))
     149    {
     150      Forms.showNotification(frm.size, "'" + frm.size.value + "' is not a valid number");
     151      return false;
     152    }
     153    else if (parseInt(frm.size.value) <= 0)
     154    {
     155      Forms.showNotification(frm.size, "Size must be &gt;0");
     156      return false;
     157    }
     158    return true;
     159  }
     160
     161  bioassays.save = function()
     162  {
     163    var frm = document.forms['bioassay'];
     164    if (TabControl.validateActiveTab('settings'))
     165    {
     166      Annotations.saveModifiedAnnotationsToForm(frm);
     167      Annotations.saveInheritedAnnotationsToForm(frm);
     168      Link.exportActions('extracts');
     169      frm.submit();
     170    }
     171  }
     172
     173  bioassays.loadAnnotationsFrame = function()
     174  {
     175    Annotations.autoLoadEditFrame(bioassays.getProtocolId(), ItemSubtype.getSubtypeId('subtype_id'));
     176  }
     177 
     178  bioassays.loadInheritedAnnotationsFrame = function()
     179  {
     180    Annotations.autoLoadInheritFrame(bioassays.getParents());
     181  }
     182 
     183  bioassays.getProtocolId = function()
     184  {
     185    var frm = document.forms['bioassay'];
     186    var protocolId = 0;
     187    if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
     188    {
     189      protocolId = Math.abs(parseInt(frm.protocol_id.value));       
     190    }
     191    return protocolId;
     192  }
     193 
     194  bioassays.getParents = function()
     195  {
     196    var frm = document.forms['bioassay'];
     197    var parents = [];
     198
     199    var arraySlideId = Math.abs(parseInt(frm.arrayslide_id.value));
     200    if (arraySlideId > 0) parents[parents.length] = 'ARRAYSLIDE:'+arraySlideId;
     201
     202    var ids = Link.getIdsInList(frm.extracts, 'EXTRACT');
     203    if (ids.length > 0)
     204    {
     205      parents[parents.length] = 'EXTRACT:'+ids.join(':');
     206    }
     207    return parents;
     208  }
     209
     210  bioassays.selectProtocol = function()
     211  {
     212    var frm = document.forms['bioassay'];
     213    var url = '&resetTemporary=1';
     214    url += ItemSubtype.createRelatedFilter('subtype_id', 'PROTOCOL');
     215    if (frm.protocol_id.length > 1)
     216    {
     217      var id = Math.abs(parseInt(frm.protocol_id[1].value));       
     218      url += '&item_id='+id;
     219    }
     220    Dialogs.selectItem('PROTOCOL', 'protocol_id', 0, url);
     221  }
     222 
     223  bioassays.setProtocolCallback = function(event)
     224  {
     225    var frm = document.forms['bioassay'];
     226    var list = frm.protocol_id;
     227    if (list.length < 2 || list[1].value == '0')
     228    {
     229      Forms.addListOption(list, 1, new Option());
     230    }
     231    list[1].value = event.detail.id;
     232    list[1].text = event.detail.name;
     233    list.selectedIndex = 1;
     234  }
     235 
     236  bioassays.subtypeOnChange = function()
     237  {
     238    var frm = document.forms['bioassay'];
     239    var subtypeId = ItemSubtype.getSubtypeId('subtype_id');
     240    var recentInfo = ItemSubtype.getRelatedProjectDefaultAndRecentItems('PHYSICALBIOASSAY', subtypeId, ['PROTOCOL', 'HARDWARE']);
     241   
     242    ItemSubtype.updateSelectionList(frm.protocol_id, recentInfo.PROTOCOL['recent'], recentInfo.PROTOCOL['default']);
     243    ItemSubtype.updateSelectionList(frm.hardware_id, recentInfo.HARDWARE['recent'], recentInfo.HARDWARE['default']);
     244  }
     245
     246  bioassays.selectHardware = function()
     247  {
     248    var frm = document.forms['bioassay'];
     249    var url = '&resetTemporary=1';
     250    url += ItemSubtype.createRelatedFilter('subtype_id', 'HARDWARE');
     251    if (frm.hardware_id.length > 1)
     252    {
     253      var id = Math.abs(parseInt(frm.hardware_id[1].value));       
     254      url += '&item_id='+id;
     255    }
     256    Dialogs.selectItem('HARDWARE', 'hardware_id', 0, url);
     257  }
     258 
     259  bioassays.setHardwareCallback = function(event)
     260  {
     261    var frm = document.forms['bioassay'];
     262    var list = frm.hardware_id;
     263    if (list.length < 2 || list[1].value == '0')
     264    {
     265      Forms.addListOption(list, 1, new Option());
     266    }
     267    list[1].value = event.detail.id;
     268    list[1].text = event.detail.name;
     269    list.selectedIndex = 1;
     270  }
     271
     272  bioassays.selectArraySlide = function()
     273  {
     274    var frm = document.forms['bioassay'];
     275    var url = '';
     276    if (frm.arrayslide_id.length > 1)
     277    {
     278      var id = Math.abs(parseInt(frm.arrayslide_id[1].value));       
     279      url += '&item_id='+id;
     280    }
     281    url += '&resetTemporary=1&tmpfilter:STRING:physicalBioAssay.name==';
     282    url += '&tmpfilter:BOOLEAN:destroyed=false';
     283    Dialogs.selectItem('ARRAYSLIDE', 'arrayslide_id', 0, url);
     284  }
     285 
     286  bioassays.setArraySlideCallback = function(event)
     287  {
     288    var frm = document.forms['bioassay'];
     289    if (frm.arrayslide_id.length < 2)
     290    {
     291      frm.arrayslide_id[frm.arrayslide_id.length] = new Option();
     292    }
     293    frm.arrayslide_id[1].value = event.detail.id;
     294    frm.arrayslide_id[1].text = event.detail.name;
     295    frm.arrayslide_id.selectedIndex = 1;
     296    bioassays.updateSize(event.detail.id);
     297  }
     298
     299  bioassays.arraySlideOnChange = function()
     300  {
     301    var frm = document.forms['bioassay'];
     302    var arraySlideId = frm.arrayslide_id.value;
     303    if (arraySlideId > 0)
     304    {
     305      bioassays.updateSize(arraySlideId);
     306    }
     307  }
     308 
     309  bioassays.updateSize = function(arraySlideId)
     310  {
     311    var request = Ajax.getXmlHttpRequest();
     312    if (request != null)
     313    {
     314      var url = '../../lims/arrayslides/ajax.jsp?ID='+App.getSessionId();
     315      url += '&cmd=GetArrayDesign&item_id=' + arraySlideId;
     316      request.open("GET", url, true);
     317      Ajax.setReadyStateHandler(request, bioassays.updateSizeCallback);
     318      request.send(null);
     319    }
     320    return request != null;
     321  }
     322 
     323  bioassays.updateSizeCallback = function(request)
     324  {
     325    var frm = document.forms['bioassay'];
     326    var response = JSON.parse(request.responseText);
     327    if (response.status != 'ok')
     328    {
     329      alert(response.message);
     330      return false;
     331    }
     332
     333    if (response.numArrays)
     334    {
     335      frm.size.value = response.numArrays;
     336    }
     337  }
     338 
     339  bioassays.addExtracts = function(event)
     340  {
     341    var frm = document.forms['bioassay'];
     342    var currentExtracts = Link.getIdsInList(frm.extracts, 'EXTRACT');
     343    var url = "&resetTemporary=1&exclude="+currentExtracts.join(',');
     344    url += ItemSubtype.createRelatedFilter('subtype_id', 'EXTRACT');
     345    Dialogs.selectItem('EXTRACT', event.currentTarget.id, 1, url);
     346  }
     347
     348  bioassays.addExtractCallback = function(event)
     349  {
     350    event.detail.name += ' [-]';
     351    event.detail.value = ':1';
     352    Link.addItem('extracts', 'EXTRACT', event.detail);
     353    bioassays.extractsOnChange();
     354  }
     355
     356  bioassays.extractsOnChange = function()
     357  {
     358    var frm = document.forms['bioassay'];
     359    var item = frm.extracts[frm.extracts.selectedIndex].item;
     360    if (item && item.id)
     361    {
     362      var i = item.value ? item.value.indexOf(':') : -1;
     363      frm.used_quantity.value = i >= 0 ? item.value.substring(0, i) : item.value;
     364      frm.position.value = i >= 0 ? item.value.substring(i+1) : '1';
     365      frm.used_quantity.focus();
     366    }
     367    else
     368    {
     369      frm.used_quantity.value = '';
     370      frm.position.value = '1';
     371    }
     372  }
     373
     374  bioassays.usedQuantityOnBlur = function()
     375  {
     376    var frm = document.forms['bioassay'];
     377    var usedQuantity = frm.used_quantity.value;
     378    var position = frm.position.value;
     379    var size = parseInt(frm.size.value);
     380    if (position != '' && (position > size || position <= 0))
     381    {
     382      Forms.showNotification(frm.position, 'Position must be between 1 and ' + size);
     383      return;
     384    }
     385    if (position == '') position = 1;
     386    var displayQuantity = usedQuantity == '' ? '-' : usedQuantity+' µg';
     387    for (var i = 0; i < frm.extracts.length; i++) // >
     388    {
     389      var option = frm.extracts[i];
     390      if (option.selected && option.item.id)
     391      {
     392        option.item.value = usedQuantity + ':' + position;
     393        var text = option.text.replace(/\[.*\]/, '['+displayQuantity+']');
     394        text = text.replace(/\d*\:/, position + ':');
     395        option.text = text;
     396      }
     397    }
     398  }
     399
     400 
    103401  return bioassays;
    104402}();
  • trunk/www/views/physicalbioassays/edit_bioassay.jsp

    r6297 r6314  
    6262  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
    6363  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
     64  import="net.sf.basedb.util.json.JsonUtil"
     65  import="net.sf.basedb.util.json.NameableConverter"
     66  import="org.json.simple.JSONObject"
    6467  import="java.util.List"
    6568  import="java.util.Set"
     
    238241  subtypesQuery.include(Include.ALL);
    239242
    240  
    241  
     243  JSONObject jsonExtracts = new JSONObject();
     244  jsonExtracts.put("itemType", "EXTRACT");
     245  if (parentExtracts != null)
     246  {
     247    final BioMaterialEvent event = creationEvent;
     248    jsonExtracts.put("items", JsonUtil.toArray(parentExtracts, new NameableConverter<Extract>()
     249    {
     250      protected void setMore(JSONObject json, Extract e)
     251      {
     252        String value = ":1";
     253        String usedQuantity = null;
     254        if (event != null)
     255        {
     256          BioMaterialEventSource evtSrc = event.getEventSource(e);
     257          Float used = evtSrc.getUsedQuantity();
     258          usedQuantity = Values.formatNumber(used, -1);
     259          int position = evtSrc.getPosition();
     260          value = usedQuantity+":"+position;
     261        }
     262        json.put("name", e.getName() + (usedQuantity == null ? " [-]" : " [" +  usedQuantity + " µg]"));
     263        json.put("value", value);
     264      }
     265    }));
     266  }
     267
    242268  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
    243269  String dateFormat = FormatterSettings.getDateFormat(sc);
     
    247273  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
    248274  %>
    249   <base:page type="popup" title="<%=title%>">
    250   <base:head scripts="tabcontrol.js,linkitems.js,subtypes.js" styles="tabcontrol.css">
     275  <base:page type="popup" title="<%=title%>" id="edit-page">
     276  <base:head scripts="tabcontrol-2.js,linkitems-2.js,subtypes.js,~bioassays.js" styles="tabcontrol.css">
    251277    <ext:scripts context="<%=jspContext%>" />
    252278    <ext:stylesheets context="<%=jspContext%>" />
    253     <script>
    254     // Validate the "Physical bioassay" tab
    255     function validatePhysicalBioAssay()
    256     {
    257       var frm = document.forms['bioassay'];
    258       if (Main.trimString(frm.name.value) == '')
    259       {
    260         Forms.showNotification(frm.name, 'You must enter a name');
    261         return false;
    262       }
    263       else if (!Numbers.isInteger(frm.size.value))
    264       {
    265         Forms.showNotification(frm.size, "'" + frm.size.value + "' is not a valid number");
    266         return false;
    267       }
    268       else if (parseInt(frm.size.value) <= 0)
    269       {
    270         Forms.showNotification(frm.size, "Size must be &gt;0");
    271         return false;
    272       }
    273       return true;
    274     }
    275 
    276     // Submit the form
    277     function saveSettings()
    278     {
    279       var frm = document.forms['bioassay'];
    280       if (TabControl.validateActiveTab('settings'))
    281       {
    282         Annotations.saveModifiedAnnotationsToForm(frm);
    283         Annotations.saveInheritedAnnotationsToForm(frm);
    284         frm.modifiedExtracts.value = Link.exportModified(frm, 'E', true).join(',');
    285         frm.removedExtracts.value = Link.getActionIds(-1, 'E').join(',');
    286         frm.submit();
    287       }
    288     }
    289    
    290     function loadAnnotationsFrame()
    291     {
    292       Annotations.autoLoadEditFrame(getProtocolId(), ItemSubtype.getSubtypeId('subtype_id'));
    293     }
    294    
    295     function loadInheritedAnnotationsFrame()
    296     {
    297       Annotations.autoLoadInheritFrame(getParents());
    298     }
    299    
    300     function getProtocolId()
    301     {
    302       var frm = document.forms['bioassay'];
    303       var protocolId = 0;
    304       if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
    305       {
    306         protocolId = Math.abs(parseInt(frm.protocol_id[frm.protocol_id.selectedIndex].value));       
    307       }
    308       return protocolId;
    309     }
    310    
    311     function getParents()
    312     {
    313       var frm = document.forms['bioassay'];
    314       var parents = new Array();
    315 
    316       var arraySlideId = Math.abs(parseInt(frm.arrayslide_id[frm.arrayslide_id.selectedIndex].value));
    317       if (arraySlideId > 0) parents[parents.length] = 'ARRAYSLIDE:'+arraySlideId;
    318 
    319       var ids = Link.getListIds(frm.extracts, 'E');
    320       if (ids.length > 0)
    321       {
    322         parents[parents.length] = 'EXTRACT:'+ids.join(':');
    323       }
    324       return parents;
    325     }
    326 
    327     function subtypeOnChange()
    328     {
    329       var frm = document.forms['bioassay'];
    330       var subtypeId = ItemSubtype.getSubtypeId('subtype_id');
    331       var recentInfo = ItemSubtype.getRelatedProjectDefaultAndRecentItems('PHYSICALBIOASSAY', subtypeId, ['PROTOCOL', 'HARDWARE']);
    332      
    333       ItemSubtype.updateSelectionList(frm.protocol_id, recentInfo.PROTOCOL['recent'], recentInfo.PROTOCOL['default']);
    334       ItemSubtype.updateSelectionList(frm.hardware_id, recentInfo.HARDWARE['recent'], recentInfo.HARDWARE['default']);
    335     }
    336    
    337     function selectProtocolOnClick()
    338     {
    339       var frm = document.forms['bioassay'];
    340       var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
    341       url += '&callback=setProtocolCallback&resetTemporary=1';
    342       url += ItemSubtype.createRelatedFilter('subtype_id', 'PROTOCOL');
    343       if (frm.protocol_id.length > 1)
    344       {
    345         var id = Math.abs(parseInt(frm.protocol_id[1].value));       
    346         url += '&item_id='+id;
    347       }
    348       Main.openPopup(url, 'SelectProtocol', 1050, 700);
    349     }
    350     function setProtocolCallback(id, name)
    351     {
    352       var frm = document.forms['bioassay'];
    353       var list = frm.protocol_id;
    354       if (list.length < 2 || list[1].value == '0') // >
    355       {
    356         Forms.addListOption(list, 1, new Option());
    357       }
    358       list[1].value = id;
    359       list[1].text = name;
    360       list.selectedIndex = 1;
    361     }
    362    
    363     function selectHardwareOnClick()
    364     {
    365       var frm = document.forms['bioassay'];
    366       var url = '../../admin/hardware/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
    367       url += '&callback=setHardwareCallback&resetTemporary=1';
    368       url += ItemSubtype.createRelatedFilter('subtype_id', 'HARDWARE');
    369       if (frm.hardware_id.length > 1)
    370       {
    371         var id = Math.abs(parseInt(frm.hardware_id[1].value));       
    372         url += '&item_id='+id;
    373       }
    374       Main.openPopup(url, 'SelectHardware', 1050, 700);
    375     }
    376     function setHardwareCallback(id, name)
    377     {
    378       var frm = document.forms['bioassay'];
    379       var list = frm.hardware_id;
    380       if (list.length < 2 || list[1].value == '0') // >
    381       {
    382         Forms.addListOption(list, 1, new Option());
    383       }
    384       list[1].value = id;
    385       list[1].text = name;
    386       list.selectedIndex = 1;
    387     }
    388    
    389     function arraySlideOnChange()
    390     {
    391       var frm = document.forms['bioassay'];
    392       var selectedIndex = frm.arrayslide_id.selectedIndex
    393       var arraySlideId = frm.arrayslide_id[selectedIndex].value;
    394       if (arraySlideId > 0) updateSize(arraySlideId);
    395     }
    396     function selectArraySlideOnClick()
    397     {
    398       var frm = document.forms['bioassay'];
    399       var url = '../../lims/arrayslides/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setArraySlideCallback';
    400       if (frm.arrayslide_id.length > 1)
    401       {
    402         var id = Math.abs(parseInt(frm.arrayslide_id[1].value));       
    403         url += '&item_id='+id;
    404       }
    405       url += '&resetTemporary=1&tmpfilter:STRING:physicalBioAssay.name==';
    406       url += '&tmpfilter:BOOLEAN:destroyed=false';
    407       Main.openPopup(url, 'SelectArraySlide', 1050, 700);
    408     }
    409     function setArraySlideCallback(arraySlideId, name)
    410     {
    411       var frm = document.forms['bioassay'];
    412       if (frm.arrayslide_id.length < 2) // >
    413       {
    414         frm.arrayslide_id[frm.arrayslide_id.length] = new Option();
    415       }
    416       frm.arrayslide_id[1].value = arraySlideId;
    417       frm.arrayslide_id[1].text = name;
    418       frm.arrayslide_id.selectedIndex = 1;
    419       updateSize(arraySlideId);
    420     }
    421     function updateSize(arraySlideId)
    422     {
    423       var request = Ajax.getXmlHttpRequest();
    424       if (request != null)
    425       {
    426         var url = '../../lims/arrayslides/ajax.jsp?ID=<%=ID%>&cmd=GetArrayDesign&item_id=' + arraySlideId;
    427         request.open("GET", url, true);
    428         Ajax.setReadyStateHandler(request, updateSizeCallback);
    429         request.send(null);
    430       }
    431       return request != null;
    432     }
    433     function updateSizeCallback(request)
    434     {
    435       var frm = document.forms['bioassay'];
    436       var response = JSON.parse(request.responseText);
    437       if (response.status != 'ok')
    438       {
    439         alert(response.message);
    440         return false;
    441       }
    442 
    443       if (response.numArrays)
    444       {
    445         frm.size.value = response.numArrays;
    446       }
    447     }
    448    
    449     function addExtractsOnClick()
    450     {
    451       var frm = document.forms['bioassay'];
    452       var ids = Link.getListIds(frm.extracts, 'L');
    453       var excludes = ids.join(',');
    454      
    455       var url = '../../biomaterials/extracts/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple';
    456       url += '&callback=addExtractCallback&resetTemporary=1';
    457       url += ItemSubtype.createRelatedFilter('subtype_id', 'EXTRACT');
    458       url += '&exclude='+excludes;
    459       Main.openPopup(url, 'AddExtracts', 1050, 700);
    460     }
    461     function addExtractCallback(extractId, name)
    462     {
    463       var item = Link.getItem('E', extractId);
    464       if (!item) item = new Item('E', extractId, '1: '+name+' [-]', '', '');
    465       Link.addItem(document.forms['bioassay'].extracts, item);
    466       extractsOnChange();
    467     }
    468     function extractsOnChange()
    469     {
    470       var frm = document.forms['bioassay'];
    471       var item = frm.extracts[frm.extracts.selectedIndex].item;
    472       if (item && item.id)
    473       {
    474         var i = item.value ? item.value.indexOf(':') : -1;
    475         frm.used_quantity.value = i >= 0 ? item.value.substring(0, i) : item.value;
    476         frm.position.value = i >= 0 ? item.value.substring(i+1) : '1';
    477         frm.used_quantity.focus();
    478       }
    479       else
    480       {
    481         frm.used_quantity.value = '';
    482         frm.position.value = '1';
    483       }
    484     }
    485     function usedQuantityOnBlur()
    486     {
    487       var frm = document.forms['bioassay'];
    488       var usedQuantity = frm.used_quantity.value;
    489       var position = frm.position.value;
    490       var size = parseInt(frm.size.value);
    491       if (position != '' && (position > size || position <= 0))
    492       {
    493         Forms.showNotification(frm.position, 'Position must be between 1 and ' + size);
    494         return;
    495       }
    496       if (position == '') position = 1;
    497       var displayQuantity = usedQuantity == '' ? '-' : usedQuantity+' µg';
    498       for (var i = 0; i < frm.extracts.length; i++) // >
    499       {
    500         var option = frm.extracts[i];
    501         if (option.selected && option.item.id)
    502         {
    503           option.item.value = usedQuantity + ':' + position;
    504           var text = option.text.replace(/\[.*\]/, '['+displayQuantity+']');
    505           text = text.replace(/\d*\:/, position + ':');
    506           option.text = text;
    507         }
    508       }
    509     }
    510     function positionOnBlur()
    511     {
    512       usedQuantityOnBlur();
    513     }
    514 
    515     function removeOnClick()
    516     {
    517       Link.removeSelected(document.forms['bioassay'].extracts);
    518     }
    519 
    520    
    521     function init()
    522     {
    523       var frm = document.forms['bioassay'];
    524       var extracts = frm.extracts;
    525       <%
    526       if (pba == null)
    527       {
    528         %>
    529         frm.name.focus();
    530         frm.name.select();
    531         <%
    532       }
    533       if (parentExtracts != null)
    534       {
    535         for (Extract extract : parentExtracts)
    536         {
    537           if (pba == null)
    538           {
    539             %>
    540             Link.addItem(extracts, new Item('E', <%=extract.getId()%>, '1: <%=HTML.javaScriptEncode(extract.getName())%> [-]', ':1'));
    541             <%
    542           }
    543           else
    544           {
    545             BioMaterialEventSource evtSrc = creationEvent.getEventSource(extract);
    546             Float used = evtSrc.getUsedQuantity();
    547             String usedQuantity = Values.formatNumber(used, -1);
    548             String usedWithUnit = used == null ? "-" : usedQuantity + " µg";
    549             int position = evtSrc.getPosition();
    550             %>
    551             Link.addNewItem(extracts, new Item('E', <%=extract.getId()%>, '<%=position + ": " + HTML.javaScriptEncode(extract.getName())%> [<%=usedWithUnit%>]', '<%=usedQuantity%>:<%=position%>'));
    552             <%
    553           }
    554         }
    555       }
    556       %>
    557     }
    558     </script>
    559279  </base:head>
    560   <base:body onload="init()">
     280  <base:body>
    561281    <h1><%=title%> <base:help tabcontrol="settings" /></h1>
    562282
     
    568288      position="bottom"  remember="<%=pba != null%>"
    569289      extensions="<%=invoker%>">
    570     <t:tab id="info" title="Physical bioassay" validate="validatePhysicalBioAssay()" helpid="physicalbioassay.edit">
     290    <t:tab id="info" title="Physical bioassay" helpid="physicalbioassay.edit">
    571291      <table class="fullform input100">
    572292      <tr>
    573293        <th>Name</th>
    574         <td><input class="text required" type="text" name="name"
     294        <td><input class="text required auto-init" data-auto-init="<%=pba == null ? "focus-select" : "focus" %>"
     295          type="text" name="name"
    575296          value="<%=name%>"
    576297          maxlength="<%=PhysicalBioAssay.MAX_NAME_LENGTH%>"></td>
     
    581302        <td>
    582303          <select name="subtype_id" id="subtype_id"
    583             <%=!readCurrentSubtype ? "disabled readonly class=\"disabled selectionlist\"" : "class=\"selectionlist\""%>
    584             onchange="subtypeOnChange()"
    585             >
     304            <%=!readCurrentSubtype ? "disabled readonly class=\"disabled selectionlist\"" : "class=\"selectionlist\""%>>
    586305          <%
    587306          if (!readCurrentSubtype)
     
    616335      <tr>
    617336        <th>Size</th>
    618         <td><input class="text required" type="text" name="size" style="width: 15em;"
     337        <td><input class="text required" type="text" name="size" id="size" style="width: 15em;"
    619338          value="<%=pba == null ? Values.getString(cc.getPropertyValue("size"), "1") : pba.getSize()%>"
    620           maxlength="10" onkeypress="return Numbers.integerOnly(event)"></td>
     339          maxlength="10"></td>
    621340        <td></td>
    622341      </tr>
     
    656375            defaultitems="<%=defaultProtocols%>"
    657376            newitem="<%=pba == null%>"
    658             onselect="selectProtocolOnClick()"
    659377          />
    660378        </td>
     
    673391            defaultitems="<%=defaultHardware%>"
    674392            newitem="<%=pba == null%>"
    675             onselect="selectHardwareOnClick()"
    676393          />
    677394        </td>
     
    688405            denied="<%=!readCurrentArraySlide%>"
    689406            newitem="<%=pba == null%>"
    690             onselect="selectArraySlideOnClick()"
    691             onchange="arraySlideOnChange()"
    692407          />
    693408        </td>
     
    708423   
    709424    <t:tab id="extracts" title="Extracts" helpid="physicalbioassay.extracts">
    710       <input type="hidden" name="modifiedExtracts" value="">
    711       <input type="hidden" name="removedExtracts" value="">
    712    
    713425      <table class="fullform input100">
    714426      <tr class="big">
     
    719431          <tr>
    720432          <td>
    721             <select name="extracts" size="15" multiple onchange="extractsOnChange()">
     433            <select name="extracts" id="extracts"
     434              class="auto-init"
     435              data-auto-init="link-container"
     436              data-initial-items="[<%=HTML.encodeTags(jsonExtracts.toJSONString()) %>]"
     437              data-initial-action="<%=pba == null ? 1 : 0 %>"
     438              size="15" multiple>
    722439            </select>
    723440          </td>
     
    725442            <base:buttongroup vertical="true">
    726443              <base:button
     444                id="btnAddExtracts"
    727445                subclass="leftaligned"
    728446                style="width: 12em;"
    729                 onclick="addExtractsOnClick()"
    730447                title="Add&nbsp;extracts&hellip;"
    731448                tooltip="Add extracts"
    732449              />
    733450              <base:button
    734                 subclass="leftaligned"
     451                subclass="leftaligned auto-init"
     452                data-auto-init="remove-link"
     453                data-list-id="extracts"
    735454                style="width: 12em;"
    736                 onclick="removeOnClick()"
    737455                title="Remove"
    738456                tooltip="Remove the selected extracts"
     
    749467        <th class="subprompt">used quantity</th>
    750468        <td>
    751             <input class="text" type="text" name="used_quantity"  style="width: 15em;"
    752               value="" maxlength="10" onkeypress="return Numbers.numberOnly(event)"
    753               onkeyup="usedQuantityOnBlur()"
    754             > (µg)
     469            <input class="text" type="text" name="used_quantity" id="used_quantity"
     470              style="width: 15em;" value="" maxlength="10"> (µg)
    755471        </td>
    756472      </tr>
     
    759475        <th class="subprompt">position</th>
    760476        <td>
    761             <input class="text" type="text" name="position" style="width: 15em;"
    762               maxlength="10" onkeypress="return Numbers.numberOnly(event)"
    763               onkeyup="positionOnBlur()"
    764             > (1 -- size of bioassay)
     477            <input class="text" type="text" name="position" id="position"
     478              style="width: 15em;" maxlength="10"> (1 -- size of bioassay)
    765479        </td>
    766480      </tr>
     
    772486    </t:tab>
    773487
    774     <t:tab id="annotations" title="Annotations &amp; parameters" helpid="annotations.edit" activate="loadAnnotationsFrame()">
     488    <t:tab id="annotations" title="Annotations &amp; parameters" helpid="annotations.edit">
    775489      <jsp:include page="../../common/annotations/annotate_frameset.jsp">
    776490        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    781495   
    782496    <t:tab id="inheritedAnnotations" title="Inherited annotations"
    783       helpid="annotations.edit.inherited" activate="loadInheritedAnnotationsFrame()">
     497      helpid="annotations.edit.inherited">
    784498      <jsp:include page="../../common/annotations/inherit_frameset.jsp">
    785499        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    796510
    797511    <base:buttongroup subclass="dialogbuttons">
    798       <base:button onclick="saveSettings()" title="Save" />
    799       <base:button onclick="window.close()" title="Cancel" />
     512      <base:button id="btnSave" title="Save" />
     513      <base:button id="close" title="Cancel" />
    800514    </base:buttongroup>
    801515  </base:body>
  • trunk/www/views/physicalbioassays/index.jsp

    r6192 r6314  
    233233     
    234234      // Extracts
    235       String[] modifiedExtracts = Values.getString(request.getParameter("modifiedExtracts")).split(",");
     235      String[] modifiedExtracts = Values.getString(request.getParameter("+EXTRACT")).split(",");
    236236      for (int i = 0; i < modifiedExtracts.length; ++i)
    237237      {
     
    240240        {
    241241          Extract e = Extract.getById(dc, extractId);
    242           String[] extra = request.getParameter("E"+extractId).split(":");
     242          String[] extra = request.getParameter("EXTRACT."+extractId).split(":");
    243243          Float usedQuantity = Values.getFloat(extra[0], null);
    244244          int position = extra.length > 1 ? Values.getInt(extra[1], 1) : 1;
     
    248248        }
    249249      }
    250       String[] removedExtracts = Values.getString(request.getParameter("removedExtracts")).split(",");
     250      String[] removedExtracts = Values.getString(request.getParameter("-EXTRACT")).split(",");
    251251      for (int i = 0; i < removedExtracts.length; ++i)
    252252      {
  • trunk/www/views/rawbioassays/bioassays.js

    r6311 r6314  
    3535    if (pageId == 'edit-page')
    3636    {
    37       // TODO
     37      // Save + Close buttons
     38      Buttons.addClickHandler('btnSave', bioassays.save);
     39      Buttons.addClickHandler('close', App.closeWindow);
     40
     41      // Tab validation
     42      TabControl.addTabActivateListener('settings.annotations', bioassays.loadAnnotationsFrame);
     43      TabControl.addTabActivateListener('settings.inheritedAnnotations', bioassays.loadInheritedAnnotationsFrame);
     44      TabControl.addTabActivateListener('settings.datafiles', bioassays.loadDataFilesFrame);
     45      TabControl.addTabValidator('settings.info', bioassays.validateRawBioAssay);
     46     
     47      // Platform
     48      Events.addEventHandler('platform', 'change', bioassays.platformOnChange);
     49      bioassays.platformOnChange();
     50
     51      // Protocol
     52      Buttons.addClickHandler('protocol_id.select', bioassays.selectProtocol);
     53      Events.addEventHandler('protocol_id', 'base-selected', bioassays.setProtocolCallback);
     54
     55      // Software
     56      Buttons.addClickHandler('software_id.select', bioassays.selectSoftware);
     57      Events.addEventHandler('software_id', 'base-selected', bioassays.setSoftwareCallback);
     58     
     59      // Parent bioassay
     60      Buttons.addClickHandler('bioassay_id.select', bioassays.selectBioAssay);
     61      Events.addEventHandler('bioassay_id', 'base-selected', bioassays.setBioAssayCallback);
     62      Events.addEventHandler('bioassay_id', 'change', bioassays.bioAssayOnChange);
     63
     64      // Array design
     65      Buttons.addClickHandler('arraydesign_id.select', bioassays.selectArrayDesign);
     66      Events.addEventHandler('arraydesign_id', 'base-selected', bioassays.setArrayDesignCallback);
     67      Events.addEventHandler('arraydesign_id', 'change', bioassays.arrayDesignOnChange);
     68
     69      // Extract
     70      Buttons.addClickHandler('extract_id.select', bioassays.selectExtract);
     71      Events.addEventHandler('extract_id', 'base-selected', bioassays.setExtractCallback);
    3872    }
    3973    else if (pageId == 'view-page')
     
    102136  }
    103137
     138  bioassays.validateRawBioAssay = function()
     139  {
     140    var frm = document.forms['rawbioassay'];
     141    if (Main.trimString(frm.name.value) == '')
     142    {
     143      Forms.showNotification(frm.name, 'You must enter a name');
     144      return false;
     145    }
     146    return true;
     147  }
     148
     149  // Submit the form
     150  bioassays.save = function()
     151  {
     152    var frm = document.forms['rawbioassay'];
     153    if (TabControl.validateActiveTab('settings'))
     154    {
     155      Annotations.saveModifiedAnnotationsToForm(frm);
     156      Annotations.saveInheritedAnnotationsToForm(frm);
     157      DataFiles.writeFileActionsToForm(frm);
     158      frm.submit();
     159    }
     160  }
     161 
     162  bioassays.loadDataFilesFrame = function()
     163  {
     164    var frm = document.forms['rawbioassay'];
     165    var selected = frm.platform[frm.platform.selectedIndex];
     166    var platform = Data.get(selected, 'platform');
     167    var variant = Data.get(selected, 'variant');
     168    DataFiles.autoLoadEditFrame(platform ? platform : 0, variant ? variant : 0, 0);
     169  }
     170
     171  bioassays.loadAnnotationsFrame = function()
     172  {
     173    Annotations.autoLoadEditFrame(bioassays.getProtocolId());
     174  }
     175 
     176  bioassays.loadInheritedAnnotationsFrame = function()
     177  {
     178    Annotations.autoLoadInheritFrame(bioassays.getParents());
     179  }
     180
     181  bioassays.getProtocolId = function()
     182  {
     183    var frm = document.forms['rawbioassay'];
     184    var protocolId = 0;
     185    if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
     186    {
     187      protocolId = Math.abs(parseInt(frm.protocol_id.value));       
     188    }
     189    return protocolId;
     190  }
     191
     192  bioassays.getParents = function()
     193  {
     194    var frm = document.forms['rawbioassay'];
     195    var parents = [];
     196
     197    var bioAssayId = Math.abs(parseInt(frm.bioassay_id.value));
     198    if (bioAssayId > 0) parents[parents.length] = 'DERIVEDBIOASSAY:'+bioAssayId;
     199    var extractId = Math.abs(parseInt(frm.extract_id.value));
     200    if (extractId > 0) parents[parents.length] = 'EXTRACT:'+extractId;
     201    if (frm.arraydesign_id)
     202    {
     203      var arrayDesignId = Math.abs(parseInt(frm.arraydesign_id.value));
     204      if (arrayDesignId > 0) parents[parents.length] = 'ARRAYDESIGN:'+arrayDesignId;
     205    }
     206    return parents;
     207  }
     208
     209  bioassays.platformOnChange = function()
     210  {
     211    var frm = document.forms['rawbioassay'];
     212    var selected = frm.platform[frm.platform.selectedIndex];
     213    var platform = Data.get(selected, 'platform');
     214    var variant = Data.get(selected, 'variant');
     215    var fileOnly = Data.int(selected, 'file-only');
     216    var rawDataType = Data.get(selected, 'raw-data-type');
     217
     218    if (frm.rawdatatype[frm.rawdatatype.length - 1].value == '')
     219    {
     220      frm.rawdatatype[frm.rawdatatype.length - 1] = null;
     221    }
     222    if (fileOnly)
     223    {
     224      frm.rawdatatype.disabled = true;
     225      Main.removeClass(frm.rawdatatype, 'required');
     226      frm.rawdatatype[frm.rawdatatype.length] = new Option('- file only -', '');
     227      frm.rawdatatype.selectedIndex = frm.rawdatatype.length - 1;
     228    }
     229    else if (rawDataType)
     230    {
     231      frm.rawdatatype.disabled = true;
     232      Main.removeClass(frm.rawdatatype, 'required');
     233      Forms.selectListOption(frm.rawdatatype, rawDataType);
     234    }
     235    else
     236    {
     237      frm.rawdatatype.disabled = Data.int('page-data', 'has-db-spots');
     238      Main.addClass(frm.rawdatatype, 'required');
     239    }
     240  }
     241
     242 
     243  bioassays.selectProtocol = function()
     244  {
     245    var frm = document.forms['rawbioassay'];
     246    var url = '&resetTemporary=1';
     247    url += '&tmpfilter:INT:itemSubtype='+Data.get('page-data', 'feature-extraction-protocol');
     248    if (frm.protocol_id.length > 1)
     249    {
     250      var id = Math.abs(parseInt(frm.protocol_id[1].value));       
     251      url += '&item_id='+id;
     252    }
     253    Dialogs.selectItem('PROTOCOL', 'protocol_id', 0, url);
     254  }
     255 
     256  bioassays.setProtocolCallback = function(event)
     257  {
     258    var frm = document.forms['rawbioassay'];
     259    var list = frm.protocol_id;
     260    if (list.length < 2 || list[1].value == '0')
     261    {
     262      Forms.addListOption(list, 1, new Option());
     263    }
     264    list[1].value = event.detail.id;
     265    list[1].text = event.detail.name;
     266    list.selectedIndex = 1;
     267  }
     268
     269  bioassays.selectSoftware = function()
     270  {
     271    var frm = document.forms['rawbioassay'];
     272    var url = '&resetTemporary=1';
     273    url += '&tmpfilter:INT:itemSubtype='+Data.get('page-data', 'feature-extraction-software');
     274    if (frm.software_id.length > 1)
     275    {
     276      var id = Math.abs(parseInt(frm.software_id[1].value));       
     277      url += '&item_id='+id;
     278    }
     279    Dialogs.selectItem('SOFTWARE', 'software_id', 0, url);
     280  }
     281 
     282  bioassays.setSoftwareCallback = function(event)
     283  {
     284    var frm = document.forms['rawbioassay'];
     285    var list = frm.software_id;
     286    if (list.length < 2 || list[1].value == '0')
     287    {
     288      Forms.addListOption(list, 1, new Option());
     289    }
     290    list[1].value = event.detail.id;
     291    list[1].text = event.detail.name;
     292    list.selectedIndex = 1;
     293  }
     294
     295  bioassays.selectBioAssay = function()
     296  {
     297    var frm = document.forms['rawbioassay'];
     298    var url = '&resetTemporary=1';
     299    if (frm.bioassay_id.length > 1)
     300    {
     301      var id = Math.abs(parseInt(frm.bioassay_id[1].value));
     302      url += '&item_id='+id;
     303    }
     304    Dialogs.selectItem('DERIVEDBIOASSAY', 'bioassay_id', 0, url);
     305  }
     306 
     307  bioassays.setBioAssayCallback = function(event)
     308  {
     309    var frm = document.forms['rawbioassay'];
     310    var list = frm.bioassay_id;
     311    if (list.length < 2 || list[1].value == '0')
     312    {
     313      Forms.addListOption(list, 1, new Option());
     314    }
     315    list[1].value = event.detail.id;
     316    list[1].text = event.detail.name;
     317    list.selectedIndex = 1;
     318    bioassays.bioAssayOnChange();
     319  }
     320
     321  bioassays.bioAssayOnChange = function()
     322  {
     323    var frm = document.forms['rawbioassay'];
     324    var bioAssayId = Math.abs(frm.bioassay_id.value);
     325    if (bioAssayId > 0) bioassays.updateArrayDesign(bioAssayId);
     326  }
     327 
     328  bioassays.updateArrayDesign = function(bioAssayId)
     329  {
     330    if (!bioAssayId) return;
     331    var request = Ajax.getXmlHttpRequest();
     332    var url = '../derivedbioassays/ajax.jsp?ID='+App.getSessionId();
     333    url += '&cmd=GetArrayDesign&item_id=' + bioAssayId;
     334    request.open("GET", url, false);
     335    request.send(null);
     336
     337    var response = JSON.parse(request.responseText);
     338    if (response.status != 'ok')
     339    {
     340      alert(response.message);
     341      return null;
     342    }
     343   
     344    var frm = document.forms['rawbioassay'];
     345    if (response.id)
     346    {
     347      var designList = frm.arraydesign_id;
     348      if (designList.length < 2 || designList[1].value == '0')
     349      {
     350        Forms.addListOption(designList, 1, new Option());
     351      }
     352      designList[1].value = response.id;
     353      designList[1].text = response.name;
     354      designList.selectedIndex = 1;
     355      bioassays.arrayDesignOnChange();
     356    }
     357  }
     358
     359  bioassays.selectArrayDesign = function()
     360  {
     361    var frm = document.forms['rawbioassay'];
     362    var url = '&resetTemporary=1';
     363    if (frm.arraydesign_id.length > 1)
     364    {
     365      var id = Math.abs(parseInt(frm.arraydesign_id[1].value));       
     366      url += '&item_id='+id;
     367    }
     368   
     369    var platform = frm.platform[frm.platform.selectedIndex];
     370    var platformId = Data.get(platform, 'platform');
     371    var variantId = Data.get(platform, 'variant');
     372    url += '&tmpfilter:INT:platform='+platformId;
     373    if (variantId) url += '&tmpfilter:INT:variant='+variantId;
     374    Dialogs.selectItem('ARRAYDESIGN', 'arraydesign_id', 0, url);
     375  }
     376 
     377  bioassays.setArrayDesignCallback = function(event)
     378  {
     379    var frm = document.forms['rawbioassay'];
     380    var list = frm.arraydesign_id;
     381    if (list.length < 2 || list[1].value == '0')
     382    {
     383      Forms.addListOption(list, 1, new Option());
     384    }
     385    list[1].value = event.detail.id;
     386    list[1].text = event.detail.name;
     387    list.selectedIndex = 1;
     388    bioassays.arrayDesignOnChange();
     389  }
     390
     391  bioassays.arrayDesignOnChange = function()
     392  {
     393    if (Data.int('page-data', 'has-db-spots'))
     394    {
     395      var oldArrayDesign = Data.get('arraydesign_id', 'current-array-design');
     396      var frm = document.forms['rawbioassay'];
     397      var selectedId = frm.arraydesign_id.value;
     398      var showFiMethod = (selectedId > 0 && selectedId != oldArrayDesign);
     399      if (showFiMethod)
     400      {
     401        Main.show('fiMethod');
     402      }
     403      else
     404      {
     405        Main.hide('fiMethod');
     406      }
     407    }
     408  }
     409
     410  bioassays.selectExtract = function()
     411  {
     412    var frm = document.forms['rawbioassay'];
     413   
     414    var relatedExtractIds = null;
     415    var bioAssayId = Math.abs(frm.bioassay_id.value);
     416    if (bioAssayId > 0)
     417    {
     418      var request = Ajax.getXmlHttpRequest();
     419      var url = '../derivedbioassays/ajax.jsp?ID='+App.getSessionId();
     420      url += '&cmd=GetAllExtractIds&bioassay_ids=' + bioAssayId;
     421      request.open("GET", url, false);
     422      request.send(null);
     423                 
     424      var response = JSON.parse(request.responseText);
     425      if (response.status != 'ok')
     426      {
     427        alert(response.message);
     428        return null;
     429      }
     430      relatedExtractIds = response.allExtractIds;
     431    }
     432   
     433    var url = '&resetTemporary=1';
     434    if (relatedExtractIds)
     435    {
     436      url += '&tmpfilter:INT:id='+relatedExtractIds.join('|');
     437    }
     438    if (frm.extract_id.length > 1)
     439    {
     440      var id = Math.abs(parseInt(frm.extract_id[1].value));
     441      url += '&item_id='+id;
     442    }
     443    Dialogs.selectItem('EXTRACT', 'extract_id', 0, url);
     444  }
     445 
     446  bioassays.setExtractCallback = function(event)
     447  {
     448    var frm = document.forms['rawbioassay'];
     449    var list = frm.extract_id;
     450    if (list.length < 2 || list[1].value == '0')
     451    {
     452      Forms.addListOption(list, 1, new Option());
     453    }
     454    list[1].value = event.detail.id;
     455    list[1].text = event.detail.name;
     456    list.selectedIndex = 1;
     457  }
     458
    104459 
    105460  return bioassays;
  • trunk/www/views/rawbioassays/edit_rawbioassay.jsp

    r6256 r6314  
    5252  import="net.sf.basedb.core.query.Orders"
    5353  import="net.sf.basedb.core.query.Hql"
     54  import="net.sf.basedb.core.query.Restrictions"
    5455  import="net.sf.basedb.clients.web.Base"
    5556  import="net.sf.basedb.clients.web.util.HTML"
     
    323324  variantQuery.include(Include.REMOVED, Include.NOT_REMOVED);
    324325  variantQuery.order(Orders.asc(Hql.property("name")));
    325   variantQuery.setCacheResult(true);
    326   ItemResultList<PlatformVariant> variants = variantQuery.list(dc);
    327  
    328  
     326  variantQuery.restrict(Restrictions.eq(Hql.property("platform"), Hql.entityParameter("platform", Item.PLATFORM)));
    329327 
    330328  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), rawBioAssay);
    331329  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
    332330  %>
    333   <base:page type="popup" title="<%=title%>">
    334   <base:head scripts="tabcontrol.js,platforms.js" styles="tabcontrol.css">
     331  <base:page type="popup" title="<%=title%>" id="edit-page">
     332  <base:head scripts="tabcontrol-2.js,~bioassays.js" styles="tabcontrol.css">
    335333    <ext:scripts context="<%=jspContext%>" />
    336334    <ext:stylesheets context="<%=jspContext%>" />
    337     <script>
    338     // Validate the "RawBioAssay" tab
    339     function validateRawBioAssay()
    340     {
    341       var frm = document.forms['rawbioassay'];
    342       if (Main.trimString(frm.name.value) == '')
    343       {
    344         Forms.showNotification(frm.name, 'You must enter a name');
    345         return false;
    346       }
    347       return true;
    348     }
    349 
    350     // Submit the form
    351     function saveSettings()
    352     {
    353       var frm = document.forms['rawbioassay'];
    354       if (TabControl.validateActiveTab('settings'))
    355       {
    356         Annotations.saveModifiedAnnotationsToForm(frm);
    357         Annotations.saveInheritedAnnotationsToForm(frm);
    358         DataFiles.writeFileActionsToForm(frm);
    359         frm.submit();
    360       }
    361     }
    362    
    363     function loadAnnotationsFrame()
    364     {
    365       Annotations.autoLoadEditFrame(getProtocolId());
    366     }
    367    
    368     function loadInheritedAnnotationsFrame()
    369     {
    370       Annotations.autoLoadInheritFrame(getParents());
    371     }
    372  
    373     function loadDataFilesFrame()
    374     {
    375       var frm = document.forms['rawbioassay'];
    376       var platform = Platforms.getSelectedPlatform(frm.platform);
    377       var variant = Platforms.getSelectedVariant(frm.platform);
    378       DataFiles.autoLoadEditFrame(platform ? platform.id : 0, variant ? variant.id : 0, 0);
    379     }
    380    
    381     function platformOnChange()
    382     {
    383       var frm = document.forms['rawbioassay'];
    384       var platform = Platforms.getSelectedPlatform(frm.platform);
    385       var variant = Platforms.getSelectedVariant(frm.platform);
    386       var fileOnly = (variant != null && variant.fileOnly) ||
    387         (variant == null && platform.fileOnly);
    388       var rawDataType = variant == null ? platform.rawDataType : variant.rawDataType;
    389       if (frm.rawdatatype[frm.rawdatatype.length - 1].value == '')
    390       {
    391         frm.rawdatatype[frm.rawdatatype.length - 1] = null;
    392       }
    393       if (fileOnly)
    394       {
    395         frm.rawdatatype.disabled = true;
    396         Main.removeClass(frm.rawdatatype, 'required');
    397         frm.rawdatatype[frm.rawdatatype.length] = new Option('- file only -', '');
    398         frm.rawdatatype.selectedIndex = frm.rawdatatype.length - 1;
    399       }
    400       else if (rawDataType)
    401       {
    402         frm.rawdatatype.disabled = true;
    403         Main.removeClass(frm.rawdatatype, 'required');
    404         Forms.selectListOption(frm.rawdatatype, rawDataType);
    405       }
    406       else
    407       {
    408         frm.rawdatatype.disabled = <%=hasDbSpots ? "true" : "false"%>;
    409         Main.addClass(frm.rawdatatype, 'required');
    410       }
    411     }
    412 
    413     function getProtocolId()
    414     {
    415       var frm = document.forms['rawbioassay'];
    416       var protocolId = 0;
    417       if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
    418       {
    419         protocolId = Math.abs(parseInt(frm.protocol_id[frm.protocol_id.selectedIndex].value));       
    420       }
    421       return protocolId;
    422     }
    423 
    424     function getParents()
    425     {
    426       var frm = document.forms['rawbioassay'];
    427       var parents = new Array();
    428 
    429       var bioAssayId = Math.abs(parseInt(frm.bioassay_id[frm.bioassay_id.selectedIndex].value));
    430       if (bioAssayId > 0) parents[parents.length] = 'DERIVEDBIOASSAY:'+bioAssayId;
    431       var extractId = Math.abs(parseInt(frm.extract_id[frm.extract_id.selectedIndex].value));
    432       if (extractId > 0) parents[parents.length] = 'EXTRACT:'+extractId;
    433       if (frm.arraydesign_id)
    434       {
    435         var arrayDesignId = Math.abs(parseInt(frm.arraydesign_id[frm.arraydesign_id.selectedIndex].value));
    436         if (arrayDesignId > 0) parents[parents.length] = 'ARRAYDESIGN:'+arrayDesignId;
    437       }
    438       return parents;
    439     }
    440 
    441     function selectProtocolOnClick()
    442     {
    443       var frm = document.forms['rawbioassay'];
    444       var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setProtocolCallback';
    445       if (frm.protocol_id.length > 1)
    446       {
    447         var id = Math.abs(parseInt(frm.protocol_id[1].value));
    448         url += '&item_id='+id;
    449       }
    450       url += '&resetTemporary=1&tmpfilter:INT:itemSubtype=<%=SystemItems.getId(Protocol.FEATURE_EXTRACTION)%>';
    451       Main.openPopup(url, 'SelectProtocol', 1050, 700);
    452     }
    453     function setProtocolCallback(id, name)
    454     {
    455       var frm = document.forms['rawbioassay'];
    456       var list = frm.protocol_id;
    457       if (list.length < 2 || list[1].value == '0') // >
    458       {
    459         Forms.addListOption(list, 1, new Option());
    460       }
    461       list[1].value = id;
    462       list[1].text = name;
    463       list.selectedIndex = 1;
    464     }
    465    
    466     function bioAssayOnChange()
    467     {
    468       var frm = document.forms['rawbioassay'];
    469       var selectedIndex = frm.bioassay_id.selectedIndex
    470       var bioAssayId = Math.abs(frm.bioassay_id[frm.bioassay_id.selectedIndex].value);
    471       if (bioAssayId > 0) updateArrayDesign(bioAssayId);
    472     }
    473     function selectBioAssayOnClick()
    474     {
    475       var frm = document.forms['rawbioassay'];
    476       var url = '../derivedbioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setBioAssayCallback';
    477       if (frm.bioassay_id.length > 1)
    478       {
    479         var id = Math.abs(parseInt(frm.bioassay_id[1].value));
    480         url += '&item_id='+id;
    481       }
    482       Main.openPopup(url, 'SelectDerivedBioAssay', 1050, 700);
    483     }
    484     function setBioAssayCallback(id, name)
    485     {
    486       var frm = document.forms['rawbioassay'];
    487       var list = frm.bioassay_id;
    488       if (list.length < 2 || list[1].value == '0') // >
    489       {
    490         Forms.addListOption(list, 1, new Option());
    491       }
    492       list[1].value = id;
    493       list[1].text = name;
    494       list.selectedIndex = 1;
    495       bioAssayOnChange();
    496     }
    497 
    498     function selectExtractOnClick()
    499     {
    500       var frm = document.forms['rawbioassay'];
    501      
    502       var relatedExtractIds = null;
    503       var bioAssayId = Math.abs(frm.bioassay_id[frm.bioassay_id.selectedIndex].value);
    504       if (bioAssayId > 0)
    505       {
    506         var request = Ajax.getXmlHttpRequest();
    507         var url = '../derivedbioassays/ajax.jsp?ID=<%=ID%>&cmd=GetAllExtractIds';
    508         url += '&bioassay_ids=' + bioAssayId;
    509         request.open("GET", url, false);
    510         request.send(null);
    511                    
    512         var response = JSON.parse(request.responseText);
    513         if (response.status != 'ok')
    514         {
    515           alert(response.message);
    516           return null;
    517         }
    518         relatedExtractIds = response.allExtractIds;
    519       }
    520      
    521       var url = '../../biomaterials/extracts/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone'
    522       url += '&callback=setExtractCallback&resetTemporary=1';
    523       if (relatedExtractIds)
    524       {
    525         url += '&tmpfilter:INT:id='+relatedExtractIds.join('|');
    526       }
    527       if (frm.extract_id.length > 1)
    528       {
    529         var id = Math.abs(parseInt(frm.extract_id[1].value));
    530         url += '&item_id='+id;
    531       }
    532       Main.openPopup(url, 'SelectExtract', 1050, 700);
    533     }
    534     function setExtractCallback(id, name)
    535     {
    536       var frm = document.forms['rawbioassay'];
    537       var list = frm.extract_id;
    538       if (list.length < 2 || list[1].value == '0') // >
    539       {
    540         Forms.addListOption(list, 1, new Option());
    541       }
    542       list[1].value = id;
    543       list[1].text = name;
    544       list.selectedIndex = 1;
    545     }
    546    
    547     function selectSoftwareOnClick()
    548     {
    549       var frm = document.forms['rawbioassay'];
    550       var url = '../../admin/software/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setSoftwareCallback';
    551       if (frm.software_id.length > 1)
    552       {
    553         var id = Math.abs(parseInt(frm.software_id[1].value));       
    554         url += '&item_id='+id;
    555       }
    556       url += '&resetTemporary=1&tmpfilter:INT:itemSubtype=<%=SystemItems.getId(Software.FEATURE_EXTRACTION)%>';
    557       Main.openPopup(url, 'SelectSoftware', 1050, 700);
    558     }
    559     function setSoftwareCallback(id, name)
    560     {
    561       var frm = document.forms['rawbioassay'];
    562       var list = frm.software_id;
    563       if (list.length < 2 || list[1].value == '0') // >
    564       {
    565         Forms.addListOption(list, 1, new Option());
    566       }
    567       list[1].value = id;
    568       list[1].text = name;
    569       list.selectedIndex = 1;
    570     }
    571    
    572     function arrayDesignOnChange()
    573     {
    574       <%
    575       if (rawBioAssay != null && rawBioAssay.getNumDbSpots() > 0)
    576       {
    577         %>
    578         var frm = document.forms['rawbioassay'];
    579         var selectedId = frm.arraydesign_id[frm.arraydesign_id.selectedIndex].value;
    580         var showFiMethod = (selectedId > 0 && selectedId != <%=currentArrayDesign == null ? 0 : currentArrayDesign.getId()%>);
    581         if (showFiMethod)
    582         {
    583           Main.show('fiMethod');
    584         }
    585         else
    586         {
    587           Main.hide('fiMethod');
    588         }
    589         <%
    590       }
    591       %>
    592     }
    593     function selectArrayDesignOnClick()
    594     {
    595       var frm = document.forms['rawbioassay'];
    596       var url = '../../lims/arraydesigns/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setArrayDesignCallback';
    597       if (frm.arraydesign_id.length > 1)
    598       {
    599         var id = Math.abs(parseInt(frm.arraydesign_id[1].value));       
    600         url += '&item_id='+id;
    601       }
    602       var platform = Platforms.getSelectedPlatform(frm.platform);
    603       url += '&resetTemporary=1&tmpfilter:INT:platform='+platform.id;
    604       Main.openPopup(url, 'SelectArrayDesign', 1050, 700);
    605     }
    606     function setArrayDesignCallback(id, name)
    607     {
    608       var frm = document.forms['rawbioassay'];
    609       var list = frm.arraydesign_id;
    610       if (list.length < 2 || list[1].value == '0') // >
    611       {
    612         Forms.addListOption(list, 1, new Option());
    613       }
    614       list[1].value = id;
    615       list[1].text = name;
    616       list.selectedIndex = 1;
    617       arrayDesignOnChange();
    618     }
    619    
    620     function updateArrayDesign(bioAssayId)
    621     {
    622       if (!bioAssayId) return;
    623       var request = Ajax.getXmlHttpRequest();
    624       var url = '../derivedbioassays/ajax.jsp?ID=<%=ID%>&cmd=GetArrayDesign&item_id=' + bioAssayId;
    625       request.open("GET", url, false);
    626       request.send(null);
    627 
    628       var response = JSON.parse(request.responseText);
    629       if (response.status != 'ok')
    630       {
    631         alert(response.message);
    632         return null;
    633       }
    634      
    635       var frm = document.forms['rawbioassay'];
    636       if (response.id)
    637       {
    638         var designList = frm.arraydesign_id;
    639         if (designList.length < 2 || designList[1].value == '0') // >
    640         {
    641           Forms.addListOption(designList, 1, new Option());
    642         }
    643         designList[1].value = response.id;
    644         designList[1].text = response.name;
    645         designList.selectedIndex = 1;
    646       }
    647     }
    648 
    649 
    650     function init()
    651     {
    652       <%
    653       if (rawBioAssay == null)
    654       {
    655         %>
    656         var frm = document.forms['rawbioassay'];
    657         frm.name.focus();
    658         frm.name.select();
    659         <%
    660       }
    661       %>
    662       initPlatforms(<%=currentPlatform == null ? 0 : currentPlatform.getId()%>, <%=currentVariant == null ? 0 : currentVariant.getId()%>);
    663       platformOnChange();
    664     }
    665    
    666     function initPlatforms(platformId, variantId)
    667     {
    668       <%
    669       for (Platform p : platforms)
    670       {
    671         if (!p.isRemoved() || p.equals(currentPlatform))
    672         {
    673           RawDataType rdt = p.isFileOnly() ? null : p.getRawDataType();
    674           %>
    675           var p<%=p.getId()%> = new Platform(<%=p.getId()%>, '<%=HTML.javaScriptEncode(p.getExternalId())%>', '<%=HTML.javaScriptEncode(p.getName())%>', <%=p.isFileOnly()%>, '<%=rdt == null ? "" : rdt.getId()%>');
    676           <%
    677         }
    678       }
    679       for (PlatformVariant v : variants)
    680       {
    681         Platform p = v.getPlatform();
    682         if ((!v.isRemoved() || v.equals(currentVariant)) && (!p.isRemoved() || p.equals(currentPlatform)))
    683         {
    684           RawDataType rdt = v.isFileOnly() ? null : v.getRawDataType();
    685           %>
    686           var v<%=v.getId()%> = new Variant(p<%=p.getId()%>, <%=v.getId()%>, '<%=HTML.javaScriptEncode(v.getExternalId())%>', '<%=HTML.javaScriptEncode(v.getName())%>', <%=v.isFileOnly()%>, '<%=rdt == null ? "" : rdt.getId()%>');
    687           <%
    688         }
    689       }
    690       %>
    691       var frm = document.forms['rawbioassay'];
    692       Platforms.populateList(frm.platform, platformId, variantId);
    693     }
    694     </script>
     335    <style>
     336    .platform
     337    {
     338      font-weight: bold;
     339      margin-top: 2px;
     340    }
     341    </style>
    695342  </base:head>
    696   <base:body onload="init()">
     343  <base:body>
    697344    <h1><%=title%> <base:help tabcontrol="settings" /></h1>
     345    <div id="page-data" class="datacontainer"
     346      data-has-db-spots="<%=hasDbSpots ? 1 : 0 %>"
     347      data-feature-extraction-protocol="<%=SystemItems.getId(Protocol.FEATURE_EXTRACTION)%>"
     348      data-feature-extraction-software="<%=SystemItems.getId(Software.FEATURE_EXTRACTION)%>"
     349    ></div>
    698350    <form action="index.jsp?ID=<%=ID%>" method="post" name="rawbioassay">
    699351    <input type="hidden" name="cmd" value="UpdateItem">
     
    704356      remember="<%=tabId == null && rawBioAssay != null%>"
    705357      extensions="<%=invoker%>">
    706     <t:tab id="info" title="Raw bioassay" validate="validateRawBioAssay()" helpid="rawbioassay.edit">
     358    <t:tab id="info" title="Raw bioassay" helpid="rawbioassay.edit">
    707359      <table class="fullform input100">
    708360      <tr>
    709361        <th>Name</th>
    710         <td><input class="text required" type="text" name="name"
     362        <td><input class="text required auto-init" data-auto-init="<%=rawBioAssay == null ? "focus-select" : "focus" %>"
     363          type="text" name="name"
    711364          value="<%=HTML.encodeTags(name)%>"
    712365          maxlength="<%=RawBioAssay.MAX_NAME_LENGTH%>"></td>
     
    716369        <th>Platform</th>
    717370        <td>
    718           <select name="platform" onchange="platformOnChange()" class="required"
     371          <select name="platform" id="platform" class="required"
    719372            <%=deniedPlatform || hasDbSpots ? "disabled" : "" %>>
    720373          <%
     
    724377            <option value="-1">- denied -
    725378            <%
     379          }
     380          else
     381          {
     382            for (Platform p : platforms)
     383            {
     384              if (!p.isRemoved() || p.equals(currentPlatform))
     385              {
     386                boolean selected = p.equals(currentPlatform) && currentVariant == null;
     387                RawDataType rdt = p.isFileOnly() ? null : p.getRawDataType();
     388                %>
     389                <option class="platform"
     390                  value="PLATFORM:<%=p.getId()%>"
     391                  data-platform="<%=p.getId()%>"
     392                  data-file-only="<%=p.isFileOnly() ? 1 : 0 %>"
     393                  data-raw-data-type="<%=rdt == null ? "" : rdt.getId() %>"
     394                  <%=selected ? "selected" : ""%>><%=HTML.encodeTags(p.getName()) %>
     395                <%
     396              }
     397              variantQuery.setEntityParameter("platform", p);
     398              List<PlatformVariant> variants = variantQuery.list(dc);
     399              PlatformVariant lastVariant = variants.size()>0 ? variants.get(variants.size()-1) : null;
     400              for (PlatformVariant v : variants)
     401              {
     402                if ((!v.isRemoved() || v.equals(currentVariant)) && (!p.isRemoved() || p.equals(currentPlatform)))
     403                {
     404                  boolean selected = v.equals(currentVariant);
     405                  RawDataType rdt = v.isFileOnly() ? null : v.getRawDataType();
     406                  String prefix = v == lastVariant ? " └ " : " ├ ";
     407                  %>
     408                  <option class="variant"
     409                    value="VARIANT:<%=v.getId()%>"
     410                    data-platform="<%=p.getId()%>"
     411                    data-variant="<%=v.getId()%>"
     412                    data-file-only="<%=v.isFileOnly() ? 1 : 0 %>"
     413                    data-raw-data-type="<%=rdt == null ? "" : rdt.getId() %>"
     414                    <%=selected ? "selected" : ""%>><%=prefix%><%=HTML.encodeTags(v.getName()) %>
     415                  <%
     416                }
     417              }
     418            }
    726419          }
    727420          %>
     
    763456            newitem="<%=rawBioAssay == null%>"
    764457            selectrecent="<%=currentExtract == null %>"
    765             onselect="selectBioAssayOnClick()"
    766             onchange="bioAssayOnChange()"
    767458          />
    768459        </td>
     
    781472            newitem="<%=rawBioAssay == null%>"
    782473            selectrecent="false"
    783             onselect="selectExtractOnClick()"
    784474          />
    785475        </td>
     
    794484            required="false"
    795485            current="<%=currentArrayDesign%>"
     486            data-current-array-design="<%=currentArrayDesign == null ? "" : currentArrayDesign.getId() %>"
    796487            denied="<%=!readCurrentArrayDesign%>"
    797488            recent="<%=recentArrayDesigns%>"
    798489            defaultitems="<%=defaultArrayDesigns%>"
    799490            newitem="<%=rawBioAssay == null%>"
    800             onselect="selectArrayDesignOnClick()"
    801             onchange="arrayDesignOnChange()"
    802491          />
    803492        </td>
     
    813502        <option value="FEATURE_ID">Feature ID (*)
    814503        </select>
    815         <br>
     504        <div class="messagecontainer help">
    816505        Select a method for feature identification. <br>
    817506        (*) The Feature ID method only works if the raw data is currently
    818507        connected to an array design which has Feature ID values.
     508        </div>
    819509        </td>
    820510        <td></td>
     
    832522            defaultitems="<%=defaultProtocols%>"
    833523            newitem="<%=rawBioAssay == null%>"
    834             onselect="selectProtocolOnClick()"
    835524          />
    836525        </td>
     
    849538            defaultitems="<%=defaultSoftware%>"
    850539            newitem="<%=rawBioAssay == null%>"
    851             onselect="selectSoftwareOnClick()"
    852540          />
    853541        </td>
     
    867555    </t:tab>
    868556   
    869     <t:tab id="datafiles" title="Data files" helpid="datafiles.edit" activate="loadDataFilesFrame()">
     557    <t:tab id="datafiles" title="Data files" helpid="datafiles.edit">
    870558      <jsp:include page="../../common/datafiles/select_frameset.jsp">
    871559        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    875563    </t:tab>
    876564
    877     <t:tab id="annotations" title="Annotations &amp; parameters" helpid="annotations.edit" activate="loadAnnotationsFrame()">
     565    <t:tab id="annotations" title="Annotations &amp; parameters" helpid="annotations.edit">
    878566      <jsp:include page="../../common/annotations/annotate_frameset.jsp">
    879567        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    884572   
    885573    <t:tab id="inheritedAnnotations" title="Inherited annotations"
    886       helpid="annotations.edit.inherited" activate="loadInheritedAnnotationsFrame()">
     574      helpid="annotations.edit.inherited">
    887575      <jsp:include page="../../common/annotations/inherit_frameset.jsp">
    888576        <jsp:param name="item_type" value="<%=itemType.name()%>" />
     
    899587
    900588    <base:buttongroup subclass="dialogbuttons">
    901       <base:button onclick="saveSettings()" title="Save" />
    902       <base:button onclick="window.close()" title="Cancel" />
     589      <base:button id="btnSave" title="Save" />
     590      <base:button id="close" title="Cancel" />
    903591    </base:buttongroup>
    904592  </base:body>
  • trunk/www/views/rawbioassays/edit_spotimages.jsp

    r6217 r6314  
    103103    readSpotImagesFile = false;
    104104  }
    105  
    106  
    107  
    108105  %>
    109 
    110106  <base:page type="popup" title="<%=title%>">
    111   <base:head scripts="tabcontrol.js,annotations.js" styles="tabcontrol.css">
    112     <script>
    113     // Validate the "RawBioAssay" tab
    114     function validateSpotImages()
    115     {
    116       var frm = document.forms['spotimages'];
    117      
    118       return true;
    119     }
    120     function selectRedFileOnClick()
    121     {
    122       var frm = document.forms['spotimages'];
    123       var url = '../../filemanager/index.jsp?ID=<%=ID%>&cmd=SelectOne&callback=setRedFileCallback';
    124       url += '&resetTemporary=1&tmpfilter:INT:itemSubtype=<%=SystemItems.getId(File.IMAGE)%>';
    125       if (frm.redfile_id.length > 1) url += '&item_id='+frm.redfile_id[1].value;
    126       Main.openPopup(url, 'SelectRedFile', 1050, 700);
    127     }
    128     function setRedFileCallback(fileId, name)
    129     {
    130       var frm = document.forms['spotimages'];
    131       if (frm.redfile_id.length < 2) // >
    132       {
    133         frm.redfile_id[frm.redfile_id.length] = new Option();
    134       }
    135       frm.redfile_id[1].value = fileId;
    136       frm.redfile_id[1].text = name;
    137       frm.redfile_id.selectedIndex = 1;
    138     }
    139 
    140     function selectGreenFileOnClick()
    141     {
    142       var frm = document.forms['spotimages'];
    143       var url = '../../filemanager/index.jsp?ID=<%=ID%>&cmd=SelectOne&callback=setGreenFileCallback';
    144       url += '&resetTemporary=1&tmpfilter:INT:itemSubtype=<%=SystemItems.getId(File.IMAGE)%>';
    145       if (frm.greenfile_id.length > 1) url += '&item_id='+frm.greenfile_id[1].value;
    146       Main.openPopup(url, 'SelectGreenFile', 1050, 700);
    147     }
    148     function setGreenFileCallback(fileId, name)
    149     {
    150       var frm = document.forms['spotimages'];
    151       if (frm.greenfile_id.length < 2) // >
    152       {
    153         frm.greenfile_id[frm.greenfile_id.length] = new Option();
    154       }
    155       frm.greenfile_id[1].value = fileId;
    156       frm.greenfile_id[1].text = name;
    157       frm.greenfile_id.selectedIndex = 1;
    158     }
    159    
    160     function selectBlueFileOnClick()
    161     {
    162       var frm = document.forms['spotimages'];
    163       var url = '../../filemanager/index.jsp?ID=<%=ID%>&cmd=SelectOne&callback=setBlueFileCallback';
    164       url += '&resetTemporary=1&tmpfilter:INT:itemSubtype=<%=SystemItems.getId(File.IMAGE)%>';
    165       if (frm.bluefile_id.length > 1) url += '&item_id='+frm.bluefile_id[1].value;
    166       Main.openPopup(url, 'SelectBlueFile', 1050, 700);
    167     }
    168     function setBlueFileCallback(fileId, name)
    169     {
    170       var frm = document.forms['spotimages'];
    171       if (frm.bluefile_id.length < 2) // >
    172       {
    173         frm.bluefile_id[frm.bluefile_id.length] = new Option();
    174       }
    175       frm.bluefile_id[1].value = fileId;
    176       frm.bluefile_id[1].text = name;
    177       frm.bluefile_id.selectedIndex = 1;
    178     }
    179 
    180     function browseOnClick()
    181     {
    182       Main.openPopup('../../filemanager/index.jsp?ID=<%=ID%>&cmd=SaveAs&callback=setSaveAsCallback', 'SaveAs', 1050, 700);
    183     }
    184     function setSaveAsCallback(path)
    185     {
    186       var frm = document.forms['spotimages'];
    187       frm.path.value = path;
    188     }
    189 
    190     // Submit the form
    191     function saveSettings()
    192     {
    193       var frm = document.forms['spotimages'];
    194       frm.submit();
    195     }
    196     </script>
    197   </base:head>
     107  <base:head scripts="~spotimages.js" />
    198108  <base:body>
    199109    <h1><%=title%> <base:help helpid="rawbioassay.edit.spotimages" /></h1>
     110   
     111    <div id="page-data" class="datacontainer"
     112      data-image-file-type="<%=SystemItems.getId(File.IMAGE)%>"
     113    ></div>
     114   
    200115    <form action="index.jsp?ID=<%=ID%>" method="post" name="spotimages">
    201116    <input type="hidden" name="item_id" value="<%=itemId%>">
     
    212127      <tr>
    213128        <th>X scale</th>
    214         <td><input type="text" class="text required" name="x_scale" style="width: 8em;"
    215           value="<%=spi.getXScale()%>" maxlength="10"
    216           onkeypress="return Numbers.integerOnly(event)"></td>
     129        <td><input type="text" class="text required auto-init" data-auto-init="integer-only"
     130          name="x_scale" style="width: 8em;"
     131          value="<%=spi.getXScale()%>" maxlength="10" ></td>
    217132
    218133        <th class="leftborder">Y scale</th>
    219         <td><input type="text" class="text required" name="y_scale" style="width: 8em;"
    220           value="<%=spi.getYScale()%>" maxlength="10"
    221           onkeypress="return Numbers.integerOnly(event)"></td>
     134        <td><input type="text" class="text required auto-init" data-auto-init="integer-only"
     135          name="y_scale" style="width: 8em;"
     136          value="<%=spi.getYScale()%>" maxlength="10"></td>
    222137      </tr>
    223138      <tr>
    224139        <th>X offset</th>
    225         <td><input type="text" class="text required" name="x_offset" style="width: 8em;"
    226           value="<%=spi.getXOffset()%>" maxlength="10"
    227           onkeypress="return Numbers.integerOnly(event)"></td>
     140        <td><input type="text" class="text required auto-init" data-auto-init="integer-only"
     141          name="x_offset" style="width: 8em;"
     142          value="<%=spi.getXOffset()%>" maxlength="10"></td>
    228143
    229144        <th class="leftborder">Y offset</th>
    230         <td><input type="text" class="text required" name="y_offset" style="width: 8em;"
    231           value="<%=spi.getYOffset()%>" maxlength="10"
    232           onkeypress="return Numbers.integerOnly(event)"></td>
     145        <td><input type="text" class="text required auto-init" data-auto-init="integer-only"
     146          name="y_offset" style="width: 8em;"
     147          value="<%=spi.getYOffset()%>" maxlength="10"></td>
    233148      </tr>
    234149      <tr>
    235150        <th>Spot size</th>
    236         <td><input type="text" class="text required" name="spotsize" style="width: 8em;"
    237           value="<%=spi.getSpotsize()%>" maxlength="10"
    238           onkeypress="return Numbers.integerOnly(event)"></td>
     151        <td><input type="text" class="text required auto-init" data-auto-init="integer-only"
     152          name="spotsize" style="width: 8em;"
     153          value="<%=spi.getSpotsize()%>" maxlength="10"></td>
    239154
    240155        <th class="leftborder">Gamma correction</th>
    241         <td><input type="text" class="text required" name="gamma" style="width: 8em;"
    242           value="<%=spi.getGamma()%>" maxlength="10"
    243           onkeypress="return Numbers.numberOnly(event)"></td>
     156        <td><input type="text" class="text required auto-init" data-auto-init="number-only"
     157          name="gamma" style="width: 8em;"
     158          value="<%=spi.getGamma()%>" maxlength="10"></td>
    244159      </tr>
    245160      <tr>
    246161        <th>Quality</th>
    247         <td><input type="text" class="text required" name="quality" style="width: 8em;"
    248           value="<%=spi.getQuality()%>" maxlength="10"
    249           onkeypress="return Numbers.integerOnly(event)"></td>
     162        <td><input type="text" class="text required auto-init" data-auto-init="integer-only"
     163          name="quality" style="width: 8em;"
     164          value="<%=spi.getQuality()%>" maxlength="10"></td>
    250165        <th class="leftborder"></th>
    251166        <td></td>
     
    264179          <tr>
    265180          <td>
    266             <select name="redfile_id" style="width: 25em;">
     181            <select name="redfile_id" id="redfile_id" style="width: 25em;">
    267182              <option value="0">- none -
    268183              <%
     
    276191            </select>
    277192          </td>
    278           <td><base:button onclick="selectRedFileOnClick()" title="Select&hellip;" /></td>
     193          <td><base:button id="btnRedFile" data-select="redfile_id" title="Select&hellip;" /></td>
    279194          </tr>
    280195          </table>
     
    288203          <tr>
    289204          <td>
    290             <select name="greenfile_id" style="width: 25em;">
     205            <select name="greenfile_id" id="greenfile_id" style="width: 25em;">
    291206              <option value="0">- none -
    292207              <%
     
    300215            </select>
    301216          </td>
    302           <td><base:button onclick="selectGreenFileOnClick()" title="Select&hellip;" /></td>
     217          <td><base:button id="btnGreenFile" data-select="greenfile_id" title="Select&hellip;" /></td>
    303218          </tr>
    304219          </table>
     
    312227          <tr>
    313228          <td>
    314             <select name="bluefile_id" style="width: 25em;">
     229            <select name="bluefile_id" id="bluefile_id" style="width: 25em;">
    315230              <option value="0">- none -
    316231              <%
     
    324239            </select>
    325240          </td>
    326           <td><base:button onclick="selectBlueFileOnClick()" title="Select&hellip;" /></td>
     241          <td><base:button id="btnBlueFile" data-select="bluefile_id" title="Select&hellip;" /></td>
    327242          </tr>
    328243          </table>
     
    336251          <tr>
    337252          <td style="width: 98%;"><input type="text" class="text required"
    338             name="path"
     253            name="path" id="path"
    339254            value="<%=spotImagesFile == null ? "" : HTML.encodeTags(spotImagesFile.getPath().toString())%>"></td>
    340           <td ><base:button
    341               title="Browse..."
    342               onclick="browseOnClick()"
    343               />
     255          <td ><base:button id="btnBrowse" title="Browse..." />
    344256          </td>
    345257          </tr>
     
    365277
    366278    <base:buttongroup subclass="dialogbuttons">
    367       <base:button onclick="saveSettings()" title="Create" image="ok.png"/>
    368       <base:button onclick="window.close()" title="Cancel" />
     279      <base:button id="btnSave" title="Create" image="ok.png"/>
     280      <base:button id="close" title="Cancel" />
    369281    </base:buttongroup>
    370282  </base:body>
  • trunk/www/views/reporterlists/edit_reporterlist.jsp

    r6217 r6314  
    7676  {
    7777    reporterList = ReporterList.getById(dc, itemId);
     78    reporterList.checkPermission(Permission.WRITE);
    7879    name = reporterList.getName();
    7980    cc.setObject("item", reporterList);
    8081    title = "Edit reporter list -- " + HTML.encodeTags(reporterList.getName());
    8182  }
    82   if (reporterList != null) reporterList.checkPermission(Permission.WRITE);
    83  
    84  
    8583 
    8684  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), reporterList);
    8785  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
    8886  %>
    89   <base:page type="popup" title="<%=title%>">
    90   <base:head scripts="tabcontrol.js" styles="tabcontrol.css">
     87  <base:page type="popup" title="<%=title%>" id="edit-page">
     88  <base:head scripts="tabcontrol-2.js,~reporterlists.js" styles="tabcontrol.css">
    9189    <ext:scripts context="<%=jspContext%>" />
    9290    <ext:stylesheets context="<%=jspContext%>" />
    93     <script>
    94     // Validate the "Reporter list" tab
    95     function validateReporterList()
    96     {
    97       var frm = document.forms['reporterList'];
    98       if (Main.trimString(frm.name.value) == '')
    99       {
    100         Forms.showNotification(frm.name, 'You must enter a name');
    101         return false;
    102       }
    103       if (frm.minCount)
    104       {
    105         var checked = Forms.getCheckedRadio(frm.create);
    106         if (checked.value == 'count')
    107         {
    108           if (!Numbers.isInteger(frm.minCount.value))
    109           {
    110             Forms.showNotification(frm.minCount, 'You must specify the number of reporter lists');
    111             return false;
    112           }
    113           else
    114           {
    115             var minCount = parseInt(frm.minCount.value);
    116             if (minCount < 1 || minCount > <%=numSelectedLists%>)
    117             {
    118               Forms.showNotification(frm.minCount, 'You must specify a value between 1 and <%=numSelectedLists%>');
    119               return false;
    120             }
    121           }
    122         }
    123       }
    124       return true;
    125     }
    126 
    127     // Submit the form
    128     function saveSettings()
    129     {
    130       var frm = document.forms['reporterList'];
    131       if (TabControl.validateActiveTab('settings'))
    132       {
    133         if (frm.which) Forms.createHidden(frm, 'items', getSelectedItems().join(','));
    134         frm.submit();
    135       }
    136     }
    137    
    138     function init()
    139     {
    140       var frm = document.forms['reporterList'];
    141       <%
    142       if (reporterList == null)
    143       {
    144         %>
    145         frm.name.focus();
    146         frm.name.select();
    147         <%
    148       }
    149       %>
    150       if (frm.which && getSelectedItems().length == 0)
    151       {
    152         frm.which[0].disabled = true;
    153         var lblSelected = document.getElementById('lblSelected');
    154         lblSelected.disabled = true;
    155         Main.addClass(lblSelected, 'disabled');
    156       }
    157     }
    158     // Get the ID:s of all selected reorters
    159     var selectedItems = new Array();
    160     var hasCheckSelectedItems = false;
    161     function getSelectedItems()
    162     {
    163       <%
    164       if (formId != null)
    165       {
    166         %>
    167         if (!hasCheckSelectedItems)
    168         {
    169           selectedItems = window.opener.Table.getSelected('<%=formId%>');
    170           hasCheckedSelectedItems = true;
    171         }
    172         <%
    173       }
    174       %>
    175       return selectedItems;
    176     }
    177     function checkRadio(radio, name)
    178     {
    179       Forms.checkRadio(radio, name);
    180     }
    181     </script>
    18291  </base:head>
    183   <base:body onload="init()">
     92  <base:body>
    18493    <h1><%=title%> <base:help tabcontrol="settings" /></h1>
     94    <div id="page-data" class="datacontainer"
     95      data-num-selected-lists="<%=numSelectedLists %>"
     96      data-add-reporters="<%=addReporters ? formId : "" %>"
     97    ></div>
    18598    <form action="index.jsp?ID=<%=ID%>" method="post" name="reporterList">
    18699    <input type="hidden" name="cmd" value="UpdateItem">
     
    198111      position="bottom" remember="<%=reporterList != null%>"
    199112      extensions="<%=invoker%>">
    200     <t:tab id="info" title="Reporter list"
    201       validate="validateReporterList()" helpid="reporterlist.edit">
     113    <t:tab id="info" title="Reporter list" helpid="reporterlist.edit">
    202114      <table class="fullform input100">
    203115      <tr>
    204116        <th>Name</th>
    205         <td><input class="text required" type="text" name="name"
     117        <td><input class="text required auto-init" data-auto-init="<%=reporterList == null ? "focus-select" : "focus" %>"
     118          type="text" name="name"
    206119          value="<%=HTML.encodeTags(name)%>"
    207120          maxlength="<%=ReporterList.MAX_NAME_LENGTH%>"></td>
     
    256169                title="The new reporter lists contains only reporters that are present in some of selected lists"
    257170                >Present in at least</label>
    258               <input type="text" class="text" name="minCount" size="2" maxlength="2"
    259                 value="1"
    260                 onkeypress="return Numbers.integerOnly(event)"
    261                 onfocus="checkRadio(document.forms['reporterList'].create, 'count');">
    262               of the selected lists (1-<%=numSelectedLists%>).
     171              <input type="text" class="text" name="minCount" id="minCount"
     172                style="width: 3em;" maxlength="2" value="1">
     173                of the selected lists (1-<%=numSelectedLists%>).
    263174              <br>
    264175          </td>
     
    288199
    289200    <base:buttongroup subclass="dialogbuttons">
    290       <base:button onclick="saveSettings()" title="Save" />
    291       <base:button onclick="window.close()" title="Cancel" />
     201      <base:button id="btnSave" title="Save" />
     202      <base:button id="close" title="Cancel" />
    292203    </base:buttongroup>
    293204  </base:body>
  • trunk/www/views/reporterlists/merge.jsp

    r6217 r6314  
    5050  String mergeType = request.getParameter("mergeType");
    5151  ReporterList reporterList = ReporterList.getById(dc, itemId);
     52  reporterList.checkPermission(Permission.WRITE);
    5253  cc.setObject("item", reporterList);
    5354  String title = "Add/keep/remove reporters: " + HTML.encodeTags(reporterList.getName());
    54   reporterList.checkPermission(Permission.WRITE);
    55  
    56  
    57  
    5855  %>
    59 
    6056  <base:page type="popup" title="<%=title%>">
    61   <base:head scripts="linkitems.js">
    62     <script>
    63     // Validate the "Reporter list" tab
    64     function validateForm()
    65     {
    66       var frm = document.forms['merge'];
    67       if (frm.reporterLists.length == 0)
    68       {
    69         Forms.showNotification('btnAddReporterLists', 'You must select at least one other reporter list');
    70         return false;
    71       }
    72       return true;
    73     }
    74 
    75     // Submit the form
    76     function saveSettings()
    77     {
    78       var frm = document.forms['merge'];
    79       if (validateForm())
    80       {
    81         frm.sourceLists.value = Link.getActionIds(1, 'R').join(',');
    82         frm.submit();
    83       }
    84     }
    85    
    86     function addReporterListsOnClick()
    87     {
    88       var frm = document.forms['merge'];
    89       var ids = Link.getListIds(frm.reporterLists, 'R');
    90       ids[ids.length] = <%=itemId%>;
    91       var excludes = ids.join(',');
    92       var url = 'index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addReporterListsCallback';
    93       url += "&exclude="+excludes;
    94       Main.openPopup(url, 'AddReporterLists', 1050, 700);
    95     }
    96     function addReporterListsCallback(reporterListId, name)
    97     {
    98       var item = Link.getItem('R', reporterListId);
    99       if (!item) item = new Item('R', reporterListId, name);
    100       Link.addItem(document.forms['merge'].reporterLists, item);
    101     }
    102     function removeReporterListsOnClick()
    103     {
    104       Link.removeSelected(document.forms['merge'].reporterLists);
    105     }
    106    
    107     function updateImage()
    108     {
    109       var frm = document.forms['merge'];
    110       var img = document.getElementById('mergeImage');
    111       var mergeType = frm.mergeType[frm.mergeType.selectedIndex].value;
    112       var sourceMerge = frm.sourceMerge[frm.sourceMerge.selectedIndex].value;
    113       var url = '../../images/set_operations/'+mergeType+'_'+sourceMerge+'.png';
    114       img.src = url;
    115     }
    116     function mergeTypeOnChange()
    117     {
    118       updateImage();
    119     }
    120     function sourceMergeOnChange()
    121     {
    122       updateImage();
    123     }
    124     function init()
    125     {
    126       updateImage();
    127     }
    128     </script>
    129   </base:head>
    130   <base:body onload="init()">
     57  <base:head scripts="linkitems-2.js,~merge.js" />
     58  <base:body>
    13159    <h1><%=title%> <base:help helpid="reporterlist.merge" /></h1>
    13260    <form action="index.jsp?ID=<%=ID%>" method="post" name="merge">
     
    14573        <th>What to do</th>
    14674        <td>
    147           <select name="mergeType" onchange="mergeTypeOnChange()">
     75          <select name="mergeType" id="mergeType">
    14876            <option value="union" <%="union".equals(mergeType) ? "selected" : ""%>
    14977              >Add reporters to
     
    15583          this list that are present in
    15684          <br>
    157           <select name="sourceMerge" onchange="sourceMergeOnChange()">
     85          <select name="sourceMerge" id="sourceMerge">
    15886            <option value="union" <%="intersection".equals(mergeType) ? "" : "selected"%>
    15987              >some of
     
    175103          <tr>
    176104          <td>
    177             <select name="reporterLists" size="10" multiple>
     105            <select name="reporterLists" id="reporterLists"
     106              class="auto-init" data-auto-init="link-container"
     107              size="10" multiple>
    178108            </select>
    179             <input type="hidden" name="sourceLists" value="">
    180109          </td>
    181110          <td>
     
    184113              <base:button
    185114                id="btnAddReporterLists"
    186                 subclass="leftaligned"
     115                subclass="leftaligned auto-init"
     116                data-auto-init="add-link"
     117                data-list-id="reporterLists"
     118                data-item-type="REPORTERLIST"
     119                data-exclude="<%=itemId%>"
    187120                style="width: 12em;"
    188                 onclick="addReporterListsOnClick()"
    189121                title="Add&nbsp;reporter lists&hellip;"
    190122                tooltip="Add reporter lists"
    191123              />
    192124              <base:button
    193                 subclass="leftaligned"
     125                subclass="leftaligned auto-init"
     126                data-auto-init="remove-link"
     127                data-list-id="reporterLists"
    194128                style="width: 12em;"
    195                 onclick="removeReporterListsOnClick()"
    196129                title="Remove"
    197130                tooltip="Remove the selected reporter lists"
    198131              />
    199132            </base:buttongroup>
    200             <input type="hidden" name="sourceLists" value="">
    201133          </td>
    202134          </tr>
     
    210142   
    211143    <base:buttongroup subclass="dialogbuttons">
    212       <base:button onclick="saveSettings()" title="Ok" />
    213       <base:button onclick="window.close()" title="Cancel" />
     144      <base:button id="btnSave" title="Ok" />
     145      <base:button id="close" title="Cancel" />
    214146    </base:buttongroup>
    215147  </base:body>
  • trunk/www/views/reporterlists/reporterlists.js

    r6311 r6314  
    2626{
    2727  var reporterlists = {};
     28  var selectedReporters = null;
    2829 
    2930  /**
     
    3536    if (pageId == 'edit-page')
    3637    {
    37       // TODO
     38      // Save + Close buttons
     39      Buttons.addClickHandler('btnSave', reporterlists.save);
     40      Buttons.addClickHandler('close', App.closeWindow);
     41
     42      // Tab validation
     43      TabControl.addTabValidator('settings.info', reporterlists.validateReporterList);
     44     
     45      // Min count
     46      Events.addEventHandler('minCount', 'keypress', Events.integerOnly);
     47      Events.addEventHandler('minCount', 'focus', reporterlists.minCountOnFocus);
     48     
     49      var addReportersForm = Data.get('page-data', 'add-reporters');
     50      if (addReportersForm)
     51      {
     52        var frm = document.forms['reporterList'];
     53        selectedReporters = window.opener.Table.getSelected(addReportersForm);
     54        var lblSelected = Doc.element('lblSelected');
     55        if (selectedReporters.length == 0)
     56        {
     57          frm.which[0].disabled = true;
     58          lblSelected.disabled = true;
     59          Main.addClass(lblSelected, 'disabled');
     60        }
     61        else
     62        {
     63          frm.which[0].checked = true;
     64        }
     65      }
    3866    }
    3967    else if (pageId == 'view-page')
     
    99127  }
    100128 
     129 
     130  reporterlists.validateReporterList = function()
     131  {
     132    var frm = document.forms['reporterList'];
     133    if (Main.trimString(frm.name.value) == '')
     134    {
     135      Forms.showNotification(frm.name, 'You must enter a name');
     136      return false;
     137    }
     138    if (frm.minCount)
     139    {
     140      var checked = Forms.getCheckedRadio(frm.create);
     141      if (checked.value == 'count')
     142      {
     143        if (!Numbers.isInteger(frm.minCount.value))
     144        {
     145          Forms.showNotification(frm.minCount, 'You must specify the number of reporter lists');
     146          return false;
     147        }
     148        else
     149        {
     150          var minCount = parseInt(frm.minCount.value);
     151          var numLists = Data.int('page-data', 'num-selected-lists');
     152          if (minCount < 1 || minCount > numLists)
     153          {
     154            Forms.showNotification(frm.minCount, 'You must specify a value between 1 and '+ numLists);
     155            return false;
     156          }
     157        }
     158      }
     159    }
     160    return true;
     161  }
     162 
     163  reporterlists.save = function()
     164  {
     165    var frm = document.forms['reporterList'];
     166    if (TabControl.validateActiveTab('settings'))
     167    {
     168      if (frm.which) Forms.createHidden(frm, 'items', selectedReporters.join(','));
     169      frm.submit();
     170    }
     171  }
     172
     173  reporterlists.minCountOnFocus = function()
     174  {
     175    var frm = document.forms['reporterList'];
     176    Forms.checkRadio(frm.create, 'count');
     177  }
     178 
    101179  return reporterlists;
    102180}();
Note: See TracChangeset for help on using the changeset viewer.