Changeset 6314
- Timestamp:
- Sep 2, 2013, 2:47:53 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/core/net/sf/basedb/util/jep/Log2Function.java
r6127 r6314 137 137 } 138 138 Object argument = stack.pop(); 139 if (argument instanceof Integer)139 if (argument instanceof Number) 140 140 { 141 141 stack.push(log2((Number)argument)); -
trunk/www/common/expression_builder.jsp
r6162 r6314 23 23 @version 2.0 24 24 --%> 25 <%@page import="net.sf.basedb.core.StringUtil"%>26 25 <%@ page pageEncoding="UTF-8" session="false" 27 26 import="net.sf.basedb.core.DbControl" … … 57 56 <% 58 57 String title = request.getParameter("title"); 59 String form = request.getParameter("form");60 58 String textarea = request.getParameter("textarea"); 61 String callback = request.getParameter("callback");62 59 Formula.Type formulaType = Formula.Type.valueOf(request.getParameter("formulatype")); 63 60 RawDataType rawDataType = RawDataTypes.getRawDataType(request.getParameter("rawdatatype")); … … 66 63 int channels = Values.getInt(request.getParameter("channels")); 67 64 final SessionControl sc = Base.getExistingSessionControl(pageContext, true); 68 65 69 66 DbControl dc = sc.newDbControl(); 70 67 try … … 97 94 %> 98 95 <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> 344 98 <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> 345 105 346 106 <form name="expression"> … … 356 116 <tbl:button 357 117 title="AND" 118 subclass="auto-init" 119 data-auto-init="enclose-selection" 120 data-prefix=" && " 121 data-suffix="" 358 122 tooltip="BOOLEAN AND: expr1 && expr2" 359 onclick="encloseSelection(' && ', '')"360 123 /> 361 124 <tbl:button 362 125 title="OR" 126 subclass="auto-init" 127 data-auto-init="enclose-selection" 128 data-prefix=" || " 129 data-suffix="" 363 130 tooltip="BOOLEAN OR: expr1 || expr2" 364 onclick="encloseSelection(' || ', '')"365 131 /> 366 132 <tbl:button 367 133 title="NOT" 134 subclass="auto-init" 135 data-auto-init="enclose-selection" 136 data-prefix="!" 137 data-suffix="" 368 138 tooltip="BOOLEAN NOT: !expr1" 369 onclick="encloseSelection('!', '')"370 139 /> 371 140 <tbl:button 372 141 title="==" 142 subclass="auto-init" 143 data-auto-init="enclose-selection" 144 data-prefix=" == " 145 data-suffix="" 373 146 tooltip="EQUAL: expr1 == expr2" 374 onclick="encloseSelection(' == ', '')"375 147 /> 376 148 <tbl:button 377 149 title="!=" 150 subclass="auto-init" 151 data-auto-init="enclose-selection" 152 data-prefix=" != " 153 data-suffix="" 378 154 tooltip="INEQUAL: expr1 != expr2" 379 onclick="encloseSelection(' != ', '')"380 155 /> 381 156 <tbl:button 382 157 title="<" 158 subclass="auto-init" 159 data-auto-init="enclose-selection" 160 data-prefix=" < " 161 data-suffix="" 383 162 tooltip="LESS: expr1 < expr2" 384 onclick="encloseSelection(' < ', '')"385 163 /> 386 164 <tbl:button 387 165 title="<=" 166 subclass="auto-init" 167 data-auto-init="enclose-selection" 168 data-prefix=" <= " 169 data-suffix="" 388 170 tooltip="LESS OR EQUAL: expr1 <= expr2" 389 onclick="encloseSelection(' <= ', '')"390 171 /> 391 172 <tbl:button 392 173 title=">=" 174 subclass="auto-init" 175 data-auto-init="enclose-selection" 176 data-prefix=" >= " 177 data-suffix="" 393 178 tooltip="MORE OR EQUAL: expr1 >= expr2" 394 onclick="encloseSelection(' >= ', '')"395 179 visible="<%=restrictions%>" 396 180 /> 397 181 <tbl:button 398 182 title=">" 183 subclass="auto-init" 184 data-auto-init="enclose-selection" 185 data-prefix=" > " 186 data-suffix="" 399 187 tooltip="MORE: expr1 > expr2" 400 onclick="encloseSelection(' > ', '')"401 188 /> 402 189 <tbl:button 403 190 title="+" 191 subclass="auto-init" 192 data-auto-init="enclose-selection" 193 data-prefix=" + " 194 data-suffix="" 404 195 tooltip="ADD: expr1 + expr2" 405 onclick="encloseSelection(' + ', '')"406 196 /> 407 197 <tbl:button 408 198 title="-" 199 subclass="auto-init" 200 data-auto-init="enclose-selection" 201 data-prefix=" - " 202 data-suffix="" 409 203 tooltip="SUBTRACT: expr1 - expr2" 410 onclick="encloseSelection(' - ', '')"411 204 /> 412 205 <tbl:button 413 206 title="*" 207 subclass="auto-init" 208 data-auto-init="enclose-selection" 209 data-prefix=" * " 210 data-suffix="" 414 211 tooltip="MULTIPLY: expr1 * expr2" 415 onclick="encloseSelection(' * ', '')"416 212 /> 417 213 <tbl:button 418 214 title="/" 215 subclass="auto-init" 216 data-auto-init="enclose-selection" 217 data-prefix=" / " 218 data-suffix="" 419 219 tooltip="DIVIDE: expr1 / expr2" 420 onclick="encloseSelection(' / ', '')"421 220 /> 422 221 <tbl:button 423 222 title="( )" 223 subclass="auto-init" 224 data-auto-init="enclose-selection" 225 data-prefix="(" 226 data-suffix=")" 424 227 tooltip="PARENTHESIS: (expr1)" 425 onclick="encloseSelection('(', ')')"426 228 /> 427 229 </tbl:toolbar> … … 439 241 <tbl:button 440 242 title="<%=function%>" 243 subclass="auto-init" 244 data-auto-init="enclose-selection" 245 data-prefix="<%=function+"(" %>" 246 data-suffix=")" 441 247 tooltip="<%=functions.getValue(i)%>" 442 onclick="<%="encloseSelection('" + function +"(', ')')"%>"443 248 /> 444 249 <% … … 451 256 <tbl:button 452 257 title="null" 258 subclass="auto-init" 259 data-auto-init="enclose-selection" 260 data-prefix="" 261 data-suffix="null" 453 262 tooltip="The null (unknown) value" 454 onclick="<%="encloseSelection('', 'null')"%>"455 263 /> 456 264 <tbl:button 457 265 title="pi" 266 subclass="auto-init" 267 data-auto-init="enclose-selection" 268 data-prefix="" 269 data-suffix="<%=Math.PI%>" 458 270 tooltip="<%="The pi value: " + Math.PI %>" 459 onclick="<%="encloseSelection('', '"+Math.PI+"')"%>"460 271 /> 461 272 <tbl:button 462 273 title="e" 274 subclass="auto-init" 275 data-auto-init="enclose-selection" 276 data-prefix="" 277 data-suffix="<%=Math.E %>" 463 278 tooltip="<%="The base of the natural logarithm: " + Math.E%>" 464 onclick="<%="encloseSelection('', '"+Math.E+"')"%>"465 279 /> 466 280 </tbl:toolbar> 467 281 <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> 471 303 <% 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 %> 485 306 <% 486 307 if (rawDataType != null && rawDataType.isStoredInDb() && rawProperties.size() > 0) … … 488 309 %> 489 310 <td class="label">Raw data: 490 <select name="rawdata" onchange="insertSelected(this)" style="width: 12em;">311 <select name="rawdata" id="rawdata" style="width: 12em;"> 491 312 <option value="">- select - 492 313 <% … … 494 315 { 495 316 %> 496 <option value="<%=tc.getJepExpression()%>"317 <option data-prefix="<%=tc.getJepExpression()%>" 497 318 title="<%=HTML.encodeTags(tc.getDescription())%>"><%=HTML.encodeTags(tc.getTitle())%> 498 319 <% … … 506 327 507 328 <td class="label">Reporter: 508 <select name="reporter" onchange="insertSelected(this)" style="width: 12em;">329 <select name="reporter" id="reporter" style="width: 12em;"> 509 330 <option value="">- select - 510 331 <% … … 512 333 { 513 334 %> 514 <option value="<%=tc.getJepExpression()%>"335 <option data-prefix="<%=tc.getJepExpression()%>" 515 336 title="<%=HTML.encodeTags(tc.getDescription())%>"><%=HTML.encodeTags(tc.getTitle())%> 516 337 <% … … 537 358 </select> 538 359 539 <select name="reporterList" onchange="insertReporterListFunction()">360 <select name="reporterList" id="reporterList"> 540 361 <option value="">- select - 541 362 <% … … 565 386 <base:buttongroup subclass="dialogbuttons"> 566 387 <base:button 567 onclick="validateOnClick()" title="Validate…" 388 id="btnValidate" 389 title="Validate…" 568 390 image="validate_formula.png" 569 391 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" /> 572 394 </base:buttongroup> 573 395 </base:body> -
trunk/www/include/scripts/main-2.js
r6308 r6314 1097 1097 url += '&title='+encodeURIComponent(title)+'&textarea='+textarea.id; 1098 1098 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); 1099 1114 } 1100 1115 -
trunk/www/views/derivedbioassays/bioassays.js
r6311 r6314 35 35 if (pageId == 'edit-page') 36 36 { 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 } 38 80 } 39 81 else if (pageId == 'view-page') … … 113 155 } 114 156 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 115 426 return bioassays; 116 427 }(); -
trunk/www/views/derivedbioassays/edit_bioassay.jsp
r6297 r6314 53 53 import="net.sf.basedb.clients.web.extensions.edit.EditUtil" 54 54 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" 55 58 import="java.util.Date" 56 59 import="java.util.List" … … 238 241 subtypesQuery.include(Include.ALL); 239 242 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 } 241 272 242 273 JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), bioAssay); 243 274 ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext); 244 275 %> 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"> 247 278 <ext:scripts context="<%=jspContext%>" /> 248 279 <ext:stylesheets context="<%=jspContext%>" /> 249 <script>250 // Validate the "BioAssay" tab251 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 form263 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 else584 {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 else612 {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 try620 {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>640 280 </base:head> 641 <base:body onload="init()">281 <base:body> 642 282 <h1><%=title%> <base:help tabcontrol="settings" /></h1> 643 283 <form action="index.jsp?ID=<%=ID%>" method="post" name="bioAssay"> … … 648 288 position="bottom" active="<%=tabId%>" remember="<%=tabId == null && bioAssay != null%>" 649 289 extensions="<%=invoker%>"> 650 <t:tab id="info" title="Bioassay" validate="validateBioAssay()"helpid="derivedbioassay.edit">290 <t:tab id="info" title="Bioassay" helpid="derivedbioassay.edit"> 651 291 <table class="fullform input100"> 652 292 <tr> 653 293 <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" 655 296 value="<%=HTML.encodeTags(bioAssay == null ? Values.getString(cc.getPropertyValue("name"), "New derived bioassay") : bioAssay.getName())%>" 656 297 maxlength="<%=DerivedBioAssay.MAX_NAME_LENGTH%>"></td> 657 298 <td></td> 658 299 </tr> 659 660 300 <tr> 661 301 <th>Type</th> 662 302 <td> 663 303 <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\""%>> 667 305 <% 668 306 if (!readCurrentSubtype) … … 704 342 <input id="isRoot" type="radio" name="isRoot" value="1" 705 343 <%=parentType == Item.PHYSICALBIOASSAY ? "checked" : "" %> 706 onchange="isRootOnChange()"><label for="isRoot">Physical bioassay</label>344 ><label for="isRoot">Physical bioassay</label> 707 345 <input id="isChild" type="radio" name="isRoot" value="0" 708 346 <%=parentType != Item.PHYSICALBIOASSAY ? "checked" : "" %> 709 onchange="isRootOnChange()"><label for="isChild">Derived bioassay</label><br>347 ><label for="isChild">Derived bioassay</label><br> 710 348 </td> 711 349 <td></td> … … 725 363 <tr> 726 364 <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> 728 371 </select> 729 372 </td> … … 732 375 <base:buttongroup vertical="true"> 733 376 <base:button 377 id="btnAddPhysicalBioAssays" 734 378 subclass="leftaligned" 735 379 style="width: 12em;" 736 onclick="addPhysicalBioAssayOnClick()"737 380 title="Add bioassays…" 738 381 tooltip="Add physical bioassays" 739 382 /> 740 383 <base:button 741 subclass="leftaligned" 384 subclass="leftaligned auto-init" 385 data-auto-init="remove-link" 386 data-list-id="physicalBioAssays" 742 387 style="width: 12em;" 743 onclick="removePhysicalBioAssayOnClick()"744 388 title="Remove" 745 389 tooltip="Remove the selected physical bioassays" 746 390 /> 747 391 </base:buttongroup> 748 <input type="hidden" name="addedPhysicalBioAssays" value="">749 <input type="hidden" name="removedPhysicalBioAssays" value="">750 392 </td> 751 393 </tr> … … 767 409 <tr> 768 410 <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> 770 417 </select> 771 418 </td> … … 774 421 <base:buttongroup vertical="true"> 775 422 <base:button 423 id="btnAddParents" 776 424 subclass="leftaligned" 777 425 style="width: 12em;" 778 onclick="addParentOnClick()"779 426 title="Add bioassays…" 780 427 tooltip="Add parent derived bioassays" 781 428 /> 782 429 <base:button 783 subclass="leftaligned" 430 subclass="leftaligned auto-init" 431 data-auto-init="remove-link" 432 data-list-id="parents" 784 433 style="width: 12em;" 785 onclick="removeParentOnClick()"786 434 title="Remove" 787 435 tooltip="Remove the selected derived bioassays" 788 436 /> 789 437 </base:buttongroup> 790 <input type="hidden" name="addedParents" value="">791 <input type="hidden" name="removedParents" value="">792 438 </td> 793 439 </tr> … … 811 457 denied="<%=!readCurrentExtract%>" 812 458 newitem="<%=bioAssay == null%>" 813 onselect="selectExtractOnClick()"814 459 /> 815 460 </td> … … 828 473 defaultitems="<%=defaultProtocols%>" 829 474 newitem="<%=bioAssay == null%>" 830 onselect="selectProtocolOnClick()"831 475 /> 832 476 </td> … … 845 489 defaultitems="<%=defaultHardware%>" 846 490 newitem="<%=bioAssay == null%>" 847 onselect="selectHardwareOnClick()"848 491 /> 849 492 </td> … … 862 505 defaultitems="<%=defaultSoftware%>" 863 506 newitem="<%=bioAssay == null%>" 864 onselect="selectSoftwareOnClick()"865 507 /> 866 508 </td> … … 881 523 </t:tab> 882 524 883 <t:tab id="datafiles" title="Data files" helpid="datafiles.edit" activate="loadDataFilesFrame()">525 <t:tab id="datafiles" title="Data files" helpid="datafiles.edit"> 884 526 <jsp:include page="../../common/datafiles/select_frameset.jsp"> 885 527 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 889 531 </t:tab> 890 532 891 <t:tab id="annotations" title="Annotations & parameters" helpid="annotations.edit" activate="loadAnnotationsFrame()">533 <t:tab id="annotations" title="Annotations & parameters" helpid="annotations.edit"> 892 534 <jsp:include page="../../common/annotations/annotate_frameset.jsp"> 893 535 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 898 540 899 541 <t:tab id="inheritedAnnotations" title="Inherited annotations" 900 helpid="annotations.edit.inherited" activate="loadInheritedAnnotationsFrame()">542 helpid="annotations.edit.inherited"> 901 543 <jsp:include page="../../common/annotations/inherit_frameset.jsp"> 902 544 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 916 558 917 559 <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" /> 920 562 </base:buttongroup> 921 563 -
trunk/www/views/derivedbioassays/index.jsp
r6192 r6314 258 258 { 259 259 // 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(","); 261 261 for (int i = 0; i < removePhysicalBioAssays.length; ++i) 262 262 { … … 265 265 } 266 266 267 String[] addPhysicalBioAssays = Values.getString(request.getParameter(" addedPhysicalBioAssays")).split(",");267 String[] addPhysicalBioAssays = Values.getString(request.getParameter("+PHYSICALBIOASSAY")).split(","); 268 268 for (int i = 0; i < addPhysicalBioAssays.length; ++i) 269 269 { … … 275 275 { 276 276 // 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(","); 278 278 for (int i = 0; i < removeParents.length; ++i) 279 279 { … … 282 282 } 283 283 284 String[] addParents = Values.getString(request.getParameter(" addedParents")).split(",");284 String[] addParents = Values.getString(request.getParameter("+DERIVEDBIOASSAY")).split(","); 285 285 for (int i = 0; i < addParents.length; ++i) 286 286 { -
trunk/www/views/formulas/edit_formula.jsp
r6217 r6314 120 120 { 121 121 formula = Formula.getById(dc, itemId); 122 formula.checkPermission(Permission.WRITE); 122 123 currentParser = formula.getParser(); 123 124 currentAverageMethod = formula.getAverageMethod(); … … 132 133 title = "Edit formula -- " + HTML.encodeTags(formula.getName()); 133 134 } 134 if (formula != null) formula.checkPermission(Permission.WRITE);135 136 137 138 135 JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), formula); 139 136 ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext); 140 137 %> 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"> 143 140 <ext:scripts context="<%=jspContext%>" /> 144 141 <ext:stylesheets context="<%=jspContext%>" /> 145 <script>146 // Validate the "Formula" tab147 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 required161 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 else168 {169 // Only one formula can be specified170 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 form212 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 sent222 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 else272 {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 else336 {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 else371 {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 else395 {396 frm.valueType.disabled = false;397 }398 }399 </script>400 142 </base:head> 401 <base:body onload="init()">143 <base:body > 402 144 <h1><%=title%> <base:help tabcontrol="settings" /></h1> 403 145 <form action="index.jsp?ID=<%=ID%>" method="post" name="formula"> … … 406 148 <t:tabcontrol id="settings" 407 149 subclass="content dialogtabcontrol" 408 position="bottom" 150 position="bottom" remember="<%=formula != null%>" 409 151 extensions="<%=invoker%>"> 410 <t:tab id="info" title="Formula" validate="validateFormula()"helpid="formula.edit">152 <t:tab id="info" title="Formula" helpid="formula.edit"> 411 153 <table class="fullform input100"> 412 154 <tr> 413 155 <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" 415 158 value="<%=HTML.encodeTags(formula == null ? Values.getString(cc.getPropertyValue("name"), "New formula") : formula.getName())%>" 416 159 maxlength="<%=Formula.MAX_NAME_LENGTH%>"></td> … … 420 163 <th>Type</th> 421 164 <td> 422 <select name="type" class="required" onchange="formulaTypeOnChange()" style="width: 15em;">165 <select name="type" class="required" id="formulaType" style="width: 15em;"> 423 166 <% 424 167 for (Formula.Type type : Formula.Type.values()) 425 168 { 426 169 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())%> 429 177 <% 430 178 } … … 454 202 <th>Raw data type</th> 455 203 <td> 456 <select name="rawdatatype" onchange="rawDataTypeOnChange()" style="width: 15em;">204 <select name="rawdatatype" id="rawdatatype" style="width: 15em;"> 457 205 <option value="">- none - 458 206 <% … … 461 209 String selected = rdt == currentRawDataType ? "selected" : ""; 462 210 %> 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())%> 464 214 <% 465 215 } … … 471 221 <tr> 472 222 <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" 474 225 style="width:15em;" 475 226 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" 477 228 ></td> 478 229 <td></td> … … 484 235 <tr> 485 236 <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"> 488 239 <% 489 240 if (expressions != null) … … 499 250 </select> 500 251 </td> 501 <td><base:button onclick="removeOnClick()" title="Remove" /></td>252 <td><base:button id="btnRemoveExpression" title="Remove" /></td> 502 253 <td></td> 503 254 </tr> 504 255 <tr> 505 256 <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%>"> 509 259 </td> 510 260 <td> 511 <base:button onclick="addOnClick()" title="Add" />261 <base:button id="btnAddExpression" title="Add" /> 512 262 </td> 513 263 <td> 514 <base:button onclick="openExpressionBuilder()" 264 <base:button 265 id="btnExpressionBuilder" 515 266 image="expression_builder.png" 516 267 title="Expression builder…" /> … … 591 342 <td> 592 343 <input type="checkbox" name="use_colors" id="useColors" value="1" 593 <%=coloring.isUsingColors() ? "checked" : "" %> 594 onclick="useColorsOnClick()"> 344 <%=coloring.isUsingColors() ? "checked" : "" %>> 595 345 <label for="useColors"><b>Use colors</b></label> 596 346 … … 605 355 <td> 606 356 <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;" 608 358 value="<%=Values.formatNumber(coloring.getMinValue(), -1)%>" 609 maxlength="6" onkeypress="return Numbers.numberOnly(event)">359 maxlength="6"> 610 360 <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;" 612 362 value="<%=Values.formatNumber(coloring.getMidValue(), -1)%>" 613 maxlength="6" onkeypress="return Numbers.numberOnly(event)">363 maxlength="6"> 614 364 <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;" 616 366 value="<%=Values.formatNumber(coloring.getMaxValue(), -1)%>" 617 maxlength="6" onkeypress="return Numbers.numberOnly(event)">367 maxlength="6"> 618 368 </td> 619 369 <td></td> … … 639 389 640 390 <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" /> 643 393 </base:buttongroup> 644 394 </base:body> -
trunk/www/views/formulas/formulas.js
r6311 r6314 35 35 if (pageId == 'edit-page') 36 36 { 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 38 68 } 39 69 else if (pageId == 'view-page') … … 73 103 } 74 104 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 75 319 return formulas; 76 320 }(); -
trunk/www/views/physicalbioassays/bioassays.js
r6311 r6314 35 35 if (pageId == 'edit-page') 36 36 { 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); 38 75 } 39 76 else if (pageId == 'view-page') … … 100 137 Main.viewOrEditItem(App.getSessionId(), 'DERIVEDBIOASSAY', 0, true, '&physicalbioassay_id='+parentId); 101 138 } 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 >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 103 401 return bioassays; 104 402 }(); -
trunk/www/views/physicalbioassays/edit_bioassay.jsp
r6297 r6314 62 62 import="net.sf.basedb.clients.web.extensions.edit.EditUtil" 63 63 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" 64 67 import="java.util.List" 65 68 import="java.util.Set" … … 238 241 subtypesQuery.include(Include.ALL); 239 242 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 242 268 Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc); 243 269 String dateFormat = FormatterSettings.getDateFormat(sc); … … 247 273 ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext); 248 274 %> 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"> 251 277 <ext:scripts context="<%=jspContext%>" /> 252 278 <ext:stylesheets context="<%=jspContext%>" /> 253 <script>254 // Validate the "Physical bioassay" tab255 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 >0");271 return false;272 }273 return true;274 }275 276 // Submit the form277 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.selectedIndex393 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 else480 {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 else544 {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>559 279 </base:head> 560 <base:body onload="init()">280 <base:body> 561 281 <h1><%=title%> <base:help tabcontrol="settings" /></h1> 562 282 … … 568 288 position="bottom" remember="<%=pba != null%>" 569 289 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"> 571 291 <table class="fullform input100"> 572 292 <tr> 573 293 <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" 575 296 value="<%=name%>" 576 297 maxlength="<%=PhysicalBioAssay.MAX_NAME_LENGTH%>"></td> … … 581 302 <td> 582 303 <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\""%>> 586 305 <% 587 306 if (!readCurrentSubtype) … … 616 335 <tr> 617 336 <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;" 619 338 value="<%=pba == null ? Values.getString(cc.getPropertyValue("size"), "1") : pba.getSize()%>" 620 maxlength="10" onkeypress="return Numbers.integerOnly(event)"></td>339 maxlength="10"></td> 621 340 <td></td> 622 341 </tr> … … 656 375 defaultitems="<%=defaultProtocols%>" 657 376 newitem="<%=pba == null%>" 658 onselect="selectProtocolOnClick()"659 377 /> 660 378 </td> … … 673 391 defaultitems="<%=defaultHardware%>" 674 392 newitem="<%=pba == null%>" 675 onselect="selectHardwareOnClick()"676 393 /> 677 394 </td> … … 688 405 denied="<%=!readCurrentArraySlide%>" 689 406 newitem="<%=pba == null%>" 690 onselect="selectArraySlideOnClick()"691 onchange="arraySlideOnChange()"692 407 /> 693 408 </td> … … 708 423 709 424 <t:tab id="extracts" title="Extracts" helpid="physicalbioassay.extracts"> 710 <input type="hidden" name="modifiedExtracts" value="">711 <input type="hidden" name="removedExtracts" value="">712 713 425 <table class="fullform input100"> 714 426 <tr class="big"> … … 719 431 <tr> 720 432 <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> 722 439 </select> 723 440 </td> … … 725 442 <base:buttongroup vertical="true"> 726 443 <base:button 444 id="btnAddExtracts" 727 445 subclass="leftaligned" 728 446 style="width: 12em;" 729 onclick="addExtractsOnClick()"730 447 title="Add extracts…" 731 448 tooltip="Add extracts" 732 449 /> 733 450 <base:button 734 subclass="leftaligned" 451 subclass="leftaligned auto-init" 452 data-auto-init="remove-link" 453 data-list-id="extracts" 735 454 style="width: 12em;" 736 onclick="removeOnClick()"737 455 title="Remove" 738 456 tooltip="Remove the selected extracts" … … 749 467 <th class="subprompt">used quantity</th> 750 468 <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) 755 471 </td> 756 472 </tr> … … 759 475 <th class="subprompt">position</th> 760 476 <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) 765 479 </td> 766 480 </tr> … … 772 486 </t:tab> 773 487 774 <t:tab id="annotations" title="Annotations & parameters" helpid="annotations.edit" activate="loadAnnotationsFrame()">488 <t:tab id="annotations" title="Annotations & parameters" helpid="annotations.edit"> 775 489 <jsp:include page="../../common/annotations/annotate_frameset.jsp"> 776 490 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 781 495 782 496 <t:tab id="inheritedAnnotations" title="Inherited annotations" 783 helpid="annotations.edit.inherited" activate="loadInheritedAnnotationsFrame()">497 helpid="annotations.edit.inherited"> 784 498 <jsp:include page="../../common/annotations/inherit_frameset.jsp"> 785 499 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 796 510 797 511 <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" /> 800 514 </base:buttongroup> 801 515 </base:body> -
trunk/www/views/physicalbioassays/index.jsp
r6192 r6314 233 233 234 234 // Extracts 235 String[] modifiedExtracts = Values.getString(request.getParameter(" modifiedExtracts")).split(",");235 String[] modifiedExtracts = Values.getString(request.getParameter("+EXTRACT")).split(","); 236 236 for (int i = 0; i < modifiedExtracts.length; ++i) 237 237 { … … 240 240 { 241 241 Extract e = Extract.getById(dc, extractId); 242 String[] extra = request.getParameter("E "+extractId).split(":");242 String[] extra = request.getParameter("EXTRACT."+extractId).split(":"); 243 243 Float usedQuantity = Values.getFloat(extra[0], null); 244 244 int position = extra.length > 1 ? Values.getInt(extra[1], 1) : 1; … … 248 248 } 249 249 } 250 String[] removedExtracts = Values.getString(request.getParameter(" removedExtracts")).split(",");250 String[] removedExtracts = Values.getString(request.getParameter("-EXTRACT")).split(","); 251 251 for (int i = 0; i < removedExtracts.length; ++i) 252 252 { -
trunk/www/views/rawbioassays/bioassays.js
r6311 r6314 35 35 if (pageId == 'edit-page') 36 36 { 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); 38 72 } 39 73 else if (pageId == 'view-page') … … 102 136 } 103 137 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 104 459 105 460 return bioassays; -
trunk/www/views/rawbioassays/edit_rawbioassay.jsp
r6256 r6314 52 52 import="net.sf.basedb.core.query.Orders" 53 53 import="net.sf.basedb.core.query.Hql" 54 import="net.sf.basedb.core.query.Restrictions" 54 55 import="net.sf.basedb.clients.web.Base" 55 56 import="net.sf.basedb.clients.web.util.HTML" … … 323 324 variantQuery.include(Include.REMOVED, Include.NOT_REMOVED); 324 325 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))); 329 327 330 328 JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), rawBioAssay); 331 329 ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext); 332 330 %> 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"> 335 333 <ext:scripts context="<%=jspContext%>" /> 336 334 <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> 695 342 </base:head> 696 <base:body onload="init()">343 <base:body> 697 344 <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> 698 350 <form action="index.jsp?ID=<%=ID%>" method="post" name="rawbioassay"> 699 351 <input type="hidden" name="cmd" value="UpdateItem"> … … 704 356 remember="<%=tabId == null && rawBioAssay != null%>" 705 357 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"> 707 359 <table class="fullform input100"> 708 360 <tr> 709 361 <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" 711 364 value="<%=HTML.encodeTags(name)%>" 712 365 maxlength="<%=RawBioAssay.MAX_NAME_LENGTH%>"></td> … … 716 369 <th>Platform</th> 717 370 <td> 718 <select name="platform" onchange="platformOnChange()" class="required"371 <select name="platform" id="platform" class="required" 719 372 <%=deniedPlatform || hasDbSpots ? "disabled" : "" %>> 720 373 <% … … 724 377 <option value="-1">- denied - 725 378 <% 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 } 726 419 } 727 420 %> … … 763 456 newitem="<%=rawBioAssay == null%>" 764 457 selectrecent="<%=currentExtract == null %>" 765 onselect="selectBioAssayOnClick()"766 onchange="bioAssayOnChange()"767 458 /> 768 459 </td> … … 781 472 newitem="<%=rawBioAssay == null%>" 782 473 selectrecent="false" 783 onselect="selectExtractOnClick()"784 474 /> 785 475 </td> … … 794 484 required="false" 795 485 current="<%=currentArrayDesign%>" 486 data-current-array-design="<%=currentArrayDesign == null ? "" : currentArrayDesign.getId() %>" 796 487 denied="<%=!readCurrentArrayDesign%>" 797 488 recent="<%=recentArrayDesigns%>" 798 489 defaultitems="<%=defaultArrayDesigns%>" 799 490 newitem="<%=rawBioAssay == null%>" 800 onselect="selectArrayDesignOnClick()"801 onchange="arrayDesignOnChange()"802 491 /> 803 492 </td> … … 813 502 <option value="FEATURE_ID">Feature ID (*) 814 503 </select> 815 < br>504 <div class="messagecontainer help"> 816 505 Select a method for feature identification. <br> 817 506 (*) The Feature ID method only works if the raw data is currently 818 507 connected to an array design which has Feature ID values. 508 </div> 819 509 </td> 820 510 <td></td> … … 832 522 defaultitems="<%=defaultProtocols%>" 833 523 newitem="<%=rawBioAssay == null%>" 834 onselect="selectProtocolOnClick()"835 524 /> 836 525 </td> … … 849 538 defaultitems="<%=defaultSoftware%>" 850 539 newitem="<%=rawBioAssay == null%>" 851 onselect="selectSoftwareOnClick()"852 540 /> 853 541 </td> … … 867 555 </t:tab> 868 556 869 <t:tab id="datafiles" title="Data files" helpid="datafiles.edit" activate="loadDataFilesFrame()">557 <t:tab id="datafiles" title="Data files" helpid="datafiles.edit"> 870 558 <jsp:include page="../../common/datafiles/select_frameset.jsp"> 871 559 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 875 563 </t:tab> 876 564 877 <t:tab id="annotations" title="Annotations & parameters" helpid="annotations.edit" activate="loadAnnotationsFrame()">565 <t:tab id="annotations" title="Annotations & parameters" helpid="annotations.edit"> 878 566 <jsp:include page="../../common/annotations/annotate_frameset.jsp"> 879 567 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 884 572 885 573 <t:tab id="inheritedAnnotations" title="Inherited annotations" 886 helpid="annotations.edit.inherited" activate="loadInheritedAnnotationsFrame()">574 helpid="annotations.edit.inherited"> 887 575 <jsp:include page="../../common/annotations/inherit_frameset.jsp"> 888 576 <jsp:param name="item_type" value="<%=itemType.name()%>" /> … … 899 587 900 588 <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" /> 903 591 </base:buttongroup> 904 592 </base:body> -
trunk/www/views/rawbioassays/edit_spotimages.jsp
r6217 r6314 103 103 readSpotImagesFile = false; 104 104 } 105 106 107 108 105 %> 109 110 106 <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" /> 198 108 <base:body> 199 109 <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 200 115 <form action="index.jsp?ID=<%=ID%>" method="post" name="spotimages"> 201 116 <input type="hidden" name="item_id" value="<%=itemId%>"> … … 212 127 <tr> 213 128 <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> 217 132 218 133 <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> 222 137 </tr> 223 138 <tr> 224 139 <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> 228 143 229 144 <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> 233 148 </tr> 234 149 <tr> 235 150 <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> 239 154 240 155 <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> 244 159 </tr> 245 160 <tr> 246 161 <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> 250 165 <th class="leftborder"></th> 251 166 <td></td> … … 264 179 <tr> 265 180 <td> 266 <select name="redfile_id" style="width: 25em;">181 <select name="redfile_id" id="redfile_id" style="width: 25em;"> 267 182 <option value="0">- none - 268 183 <% … … 276 191 </select> 277 192 </td> 278 <td><base:button onclick="selectRedFileOnClick()" title="Select…" /></td>193 <td><base:button id="btnRedFile" data-select="redfile_id" title="Select…" /></td> 279 194 </tr> 280 195 </table> … … 288 203 <tr> 289 204 <td> 290 <select name="greenfile_id" style="width: 25em;">205 <select name="greenfile_id" id="greenfile_id" style="width: 25em;"> 291 206 <option value="0">- none - 292 207 <% … … 300 215 </select> 301 216 </td> 302 <td><base:button onclick="selectGreenFileOnClick()" title="Select…" /></td>217 <td><base:button id="btnGreenFile" data-select="greenfile_id" title="Select…" /></td> 303 218 </tr> 304 219 </table> … … 312 227 <tr> 313 228 <td> 314 <select name="bluefile_id" style="width: 25em;">229 <select name="bluefile_id" id="bluefile_id" style="width: 25em;"> 315 230 <option value="0">- none - 316 231 <% … … 324 239 </select> 325 240 </td> 326 <td><base:button onclick="selectBlueFileOnClick()" title="Select…" /></td>241 <td><base:button id="btnBlueFile" data-select="bluefile_id" title="Select…" /></td> 327 242 </tr> 328 243 </table> … … 336 251 <tr> 337 252 <td style="width: 98%;"><input type="text" class="text required" 338 name="path" 253 name="path" id="path" 339 254 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..." /> 344 256 </td> 345 257 </tr> … … 365 277 366 278 <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" /> 369 281 </base:buttongroup> 370 282 </base:body> -
trunk/www/views/reporterlists/edit_reporterlist.jsp
r6217 r6314 76 76 { 77 77 reporterList = ReporterList.getById(dc, itemId); 78 reporterList.checkPermission(Permission.WRITE); 78 79 name = reporterList.getName(); 79 80 cc.setObject("item", reporterList); 80 81 title = "Edit reporter list -- " + HTML.encodeTags(reporterList.getName()); 81 82 } 82 if (reporterList != null) reporterList.checkPermission(Permission.WRITE);83 84 85 83 86 84 JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), reporterList); 87 85 ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext); 88 86 %> 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"> 91 89 <ext:scripts context="<%=jspContext%>" /> 92 90 <ext:stylesheets context="<%=jspContext%>" /> 93 <script>94 // Validate the "Reporter list" tab95 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 else114 {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 form128 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 reorters159 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>182 91 </base:head> 183 <base:body onload="init()">92 <base:body> 184 93 <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> 185 98 <form action="index.jsp?ID=<%=ID%>" method="post" name="reporterList"> 186 99 <input type="hidden" name="cmd" value="UpdateItem"> … … 198 111 position="bottom" remember="<%=reporterList != null%>" 199 112 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"> 202 114 <table class="fullform input100"> 203 115 <tr> 204 116 <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" 206 119 value="<%=HTML.encodeTags(name)%>" 207 120 maxlength="<%=ReporterList.MAX_NAME_LENGTH%>"></td> … … 256 169 title="The new reporter lists contains only reporters that are present in some of selected lists" 257 170 >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%>). 263 174 <br> 264 175 </td> … … 288 199 289 200 <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" /> 292 203 </base:buttongroup> 293 204 </base:body> -
trunk/www/views/reporterlists/merge.jsp
r6217 r6314 50 50 String mergeType = request.getParameter("mergeType"); 51 51 ReporterList reporterList = ReporterList.getById(dc, itemId); 52 reporterList.checkPermission(Permission.WRITE); 52 53 cc.setObject("item", reporterList); 53 54 String title = "Add/keep/remove reporters: " + HTML.encodeTags(reporterList.getName()); 54 reporterList.checkPermission(Permission.WRITE);55 56 57 58 55 %> 59 60 56 <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> 131 59 <h1><%=title%> <base:help helpid="reporterlist.merge" /></h1> 132 60 <form action="index.jsp?ID=<%=ID%>" method="post" name="merge"> … … 145 73 <th>What to do</th> 146 74 <td> 147 <select name="mergeType" onchange="mergeTypeOnChange()">75 <select name="mergeType" id="mergeType"> 148 76 <option value="union" <%="union".equals(mergeType) ? "selected" : ""%> 149 77 >Add reporters to … … 155 83 this list that are present in 156 84 <br> 157 <select name="sourceMerge" onchange="sourceMergeOnChange()">85 <select name="sourceMerge" id="sourceMerge"> 158 86 <option value="union" <%="intersection".equals(mergeType) ? "" : "selected"%> 159 87 >some of … … 175 103 <tr> 176 104 <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> 178 108 </select> 179 <input type="hidden" name="sourceLists" value="">180 109 </td> 181 110 <td> … … 184 113 <base:button 185 114 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%>" 187 120 style="width: 12em;" 188 onclick="addReporterListsOnClick()"189 121 title="Add reporter lists…" 190 122 tooltip="Add reporter lists" 191 123 /> 192 124 <base:button 193 subclass="leftaligned" 125 subclass="leftaligned auto-init" 126 data-auto-init="remove-link" 127 data-list-id="reporterLists" 194 128 style="width: 12em;" 195 onclick="removeReporterListsOnClick()"196 129 title="Remove" 197 130 tooltip="Remove the selected reporter lists" 198 131 /> 199 132 </base:buttongroup> 200 <input type="hidden" name="sourceLists" value="">201 133 </td> 202 134 </tr> … … 210 142 211 143 <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" /> 214 146 </base:buttongroup> 215 147 </base:body> -
trunk/www/views/reporterlists/reporterlists.js
r6311 r6314 26 26 { 27 27 var reporterlists = {}; 28 var selectedReporters = null; 28 29 29 30 /** … … 35 36 if (pageId == 'edit-page') 36 37 { 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 } 38 66 } 39 67 else if (pageId == 'view-page') … … 99 127 } 100 128 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 101 179 return reporterlists; 102 180 }();
Note: See TracChangeset
for help on using the changeset viewer.