extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/move_registration.js

Code
Comments
Other
Rev Date Author Line
7184 22 May 23 nicklas 1 var Move = function()
7184 22 May 23 nicklas 2 {
7184 22 May 23 nicklas 3   var move = {};
7184 22 May 23 nicklas 4   var debug = 0;
7184 22 May 23 nicklas 5
7184 22 May 23 nicklas 6   var samples;
7184 22 May 23 nicklas 7   var prefixes;
7184 22 May 23 nicklas 8
7184 22 May 23 nicklas 9   var missingSamplesIsValid = true;
7184 22 May 23 nicklas 10   var extraSamplesIsValid = true;
7184 22 May 23 nicklas 11   
7184 22 May 23 nicklas 12
7184 22 May 23 nicklas 13   // Page initialization
7184 22 May 23 nicklas 14   move.initPage = function()
7184 22 May 23 nicklas 15   {
7184 22 May 23 nicklas 16     // Step 1
7184 22 May 23 nicklas 17     Events.addEventHandler('step-1', 'wizard-validate', move.validateStep1);
7184 22 May 23 nicklas 18     Events.addEventHandler('transportBox', 'change', move.transportBoxOnChange);
7184 22 May 23 nicklas 19     
7184 22 May 23 nicklas 20     // Step 2
7184 22 May 23 nicklas 21     Events.addEventHandler('step-2', 'wizard-initialize', move.initializeStep2);
7184 22 May 23 nicklas 22     Events.addEventHandler('step-2', 'wizard-validate', move.validateStep2);
7184 22 May 23 nicklas 23     Events.addEventHandler('moveDate', 'change', Wizard.validateDate);
7184 22 May 23 nicklas 24     Events.addEventHandler('noMissingSamples', 'click', move.noMissingSamplesOnClick);
7184 22 May 23 nicklas 25     Events.addEventHandler('missingSamples', 'change', move.missingSamplesOnChange);
7184 22 May 23 nicklas 26     Events.addEventHandler('extraSamples', 'change', move.extraSamplesOnChange);
7184 22 May 23 nicklas 27     Buttons.addClickHandler('showMissingSampleMenu', move.showMissingSamplesMenu);
7184 22 May 23 nicklas 28     Events.addEventHandler('select-missing-sample', 'click', move.missingSampleSelected);
7184 22 May 23 nicklas 29     Events.addEventHandler(document.body, 'click', move.hideMissingSampleMenu);
7184 22 May 23 nicklas 30
7184 22 May 23 nicklas 31     // Navigation
7184 22 May 23 nicklas 32     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
7184 22 May 23 nicklas 33     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
7184 22 May 23 nicklas 34     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
7184 22 May 23 nicklas 35     Buttons.addClickHandler('goregister', Wizard.goRegister);
7184 22 May 23 nicklas 36
7184 22 May 23 nicklas 37     // Final registration
7184 22 May 23 nicklas 38     Events.addEventHandler('wizard', 'wizard-submit', move.submit);
7184 22 May 23 nicklas 39
7184 22 May 23 nicklas 40     var url = '../ExternalSpecimen.servlet?ID='+App.getSessionId();
7184 22 May 23 nicklas 41     url += '&cmd=GetTransportBoxesToMove';
7184 22 May 23 nicklas 42     Wizard.showLoadingAnimation('Loading transport boxes...');
7184 22 May 23 nicklas 43     Wizard.asyncJsonRequest(url, move.initializeStep1);
7184 22 May 23 nicklas 44   }
7184 22 May 23 nicklas 45
7184 22 May 23 nicklas 46   move.initializeStep1 = function(response)
7184 22 May 23 nicklas 47   {
7184 22 May 23 nicklas 48     var frm = document.forms['reggie'];  
7184 22 May 23 nicklas 49
7184 22 May 23 nicklas 50     var transportBoxes = response.transportBoxes;
7184 22 May 23 nicklas 51     var boxes = frm.transportBox;
7184 22 May 23 nicklas 52     if (transportBoxes.length > 0)
7184 22 May 23 nicklas 53     {
7184 22 May 23 nicklas 54       for (var i=0; i < transportBoxes.length; i++)
7184 22 May 23 nicklas 55       {
7184 22 May 23 nicklas 56         var box = transportBoxes[i];
7184 22 May 23 nicklas 57         var name = box.name + ' ('+box.size+' samples)';
7184 22 May 23 nicklas 58         var option = new Option(name, box.id);
7184 22 May 23 nicklas 59         option.box = box;
7184 22 May 23 nicklas 60         boxes.options[boxes.length] = option;
7184 22 May 23 nicklas 61       }
7184 22 May 23 nicklas 62       
7184 22 May 23 nicklas 63       move.transportBoxOnChange();
7184 22 May 23 nicklas 64     }
7184 22 May 23 nicklas 65     else
7184 22 May 23 nicklas 66     {
7184 22 May 23 nicklas 67       Wizard.setFatalError('No transport boxes available for processing.');
7184 22 May 23 nicklas 68       return;
7184 22 May 23 nicklas 69     }
7184 22 May 23 nicklas 70
7184 22 May 23 nicklas 71     Doc.show('step-1');
7184 22 May 23 nicklas 72     Doc.show('gonext');
7184 22 May 23 nicklas 73   }
7184 22 May 23 nicklas 74   
7184 22 May 23 nicklas 75   move.transportBoxOnChange = function()
7184 22 May 23 nicklas 76   {
7184 22 May 23 nicklas 77     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 78     var box = frm.transportBox[frm.transportBox.selectedIndex].box;
7186 22 May 23 nicklas 79     Doc.element('boxComments').innerHTML = Strings.encodeTags(box.comments);
7186 22 May 23 nicklas 80     frm.comments.value = box.comments;
7184 22 May 23 nicklas 81   }
7184 22 May 23 nicklas 82   
7184 22 May 23 nicklas 83   move.validateStep1 = function(event)
7184 22 May 23 nicklas 84   {}
7184 22 May 23 nicklas 85   
7184 22 May 23 nicklas 86   move.initializeStep2 = function()
7184 22 May 23 nicklas 87   {
7184 22 May 23 nicklas 88     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 89     var url = '../ExternalSpecimen.servlet?ID='+App.getSessionId();
7184 22 May 23 nicklas 90     url += '&cmd=GetTransportBoxDetailsForMove&listId='+frm.transportBox.value;    
7184 22 May 23 nicklas 91     Wizard.showLoadingAnimation('Loading transport box information...');
7184 22 May 23 nicklas 92     Wizard.asyncJsonRequest(url, move.transportBoxLoaded);
7184 22 May 23 nicklas 93   }
7184 22 May 23 nicklas 94   
7184 22 May 23 nicklas 95   move.transportBoxLoaded = function(response)
7184 22 May 23 nicklas 96   {
7184 22 May 23 nicklas 97     samples = response.samples;
7184 22 May 23 nicklas 98     prefixes = response.prefixes;
7184 22 May 23 nicklas 99     
7184 22 May 23 nicklas 100     var selectMissingSample = '';
7184 22 May 23 nicklas 101     var lastBoxRow = 0;
7184 22 May 23 nicklas 102     for (var i = 0; i < samples.length; i++)
7184 22 May 23 nicklas 103     {
7184 22 May 23 nicklas 104       var sample = samples[i];
7184 22 May 23 nicklas 105       var ref = sample.clarityId.match('^(.*?)(\\d+)$');
7184 22 May 23 nicklas 106       if (i > 0 && lastBoxRow != sample.well.row)
7184 22 May 23 nicklas 107       {
7184 22 May 23 nicklas 108         lastBoxRow = sample.well.row;
7184 22 May 23 nicklas 109         selectMissingSample += '<div class="menuseparator"></div>';
7184 22 May 23 nicklas 110       }
7184 22 May 23 nicklas 111       selectMissingSample += '<div class="menuitem enabled interactable" id="sample-'+sample.id+'" data-clarity-id="'+sample.clarityId+'">';
7184 22 May 23 nicklas 112       selectMissingSample += Strings.encodeTags(sample.well.location+': ');
7184 22 May 23 nicklas 113       if (ref)
7184 22 May 23 nicklas 114       {
7184 22 May 23 nicklas 115         selectMissingSample += ref[1]+'<b>'+ref[2]+'</b>';
7184 22 May 23 nicklas 116       }
7184 22 May 23 nicklas 117       else
7184 22 May 23 nicklas 118       {
7184 22 May 23 nicklas 119         selectMissingSample += Strings.encodeTags(sample.clarityId);
7184 22 May 23 nicklas 120       }
7184 22 May 23 nicklas 121       selectMissingSample += ' - '+Strings.encodeTags(sample.specimenName);
7184 22 May 23 nicklas 122       selectMissingSample += '</div>';
7184 22 May 23 nicklas 123     }
7184 22 May 23 nicklas 124     Doc.element('missing-samples-list').innerHTML = selectMissingSample;
7184 22 May 23 nicklas 125
7184 22 May 23 nicklas 126     Wizard.setCurrentStep(2);
7184 22 May 23 nicklas 127     Doc.show('step-2');
7184 22 May 23 nicklas 128     Doc.show('gocancel');
7184 22 May 23 nicklas 129     Doc.show('goregister');
7184 22 May 23 nicklas 130     Doc.element('moveDate').focus();
7184 22 May 23 nicklas 131   }
7184 22 May 23 nicklas 132   
7184 22 May 23 nicklas 133   move.noMissingSamplesOnClick = function()
7184 22 May 23 nicklas 134   {
7184 22 May 23 nicklas 135     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 136     
7184 22 May 23 nicklas 137     if (frm.noMissingSamples.checked)
7184 22 May 23 nicklas 138     {
7184 22 May 23 nicklas 139       frm.missingSamples.storedValue = frm.missingSamples.value;
7184 22 May 23 nicklas 140       frm.missingSamples.value = '';
7184 22 May 23 nicklas 141       Wizard.setInputStatus('missingSamples', 'valid');
7184 22 May 23 nicklas 142     }
7184 22 May 23 nicklas 143     else
7184 22 May 23 nicklas 144     {
7184 22 May 23 nicklas 145       frm.missingSamples.value = frm.missingSamples.storedValue || '';
7184 22 May 23 nicklas 146       frm.missingSamples.focus();
7184 22 May 23 nicklas 147       if (frm.missingSamples.value != '') Events.sendChangeEvent('missingSamples');
7184 22 May 23 nicklas 148     }  
7184 22 May 23 nicklas 149   }
7184 22 May 23 nicklas 150   
7184 22 May 23 nicklas 151   move.missingSamplesOnChange = function()
7184 22 May 23 nicklas 152   {
7184 22 May 23 nicklas 153     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 154     
7184 22 May 23 nicklas 155     Wizard.setInputStatus('missingSamples');
7184 22 May 23 nicklas 156     missingSamplesIsValid = true;
7184 22 May 23 nicklas 157     var missing = Strings.trim(frm.missingSamples.value).toUpperCase();
7184 22 May 23 nicklas 158     
7184 22 May 23 nicklas 159     frm.noMissingSamples.checked = missing == '';
7184 22 May 23 nicklas 160     if (missing != '')
7184 22 May 23 nicklas 161     {
7184 22 May 23 nicklas 162       var invalid = [];
7184 22 May 23 nicklas 163       var ids = missing.match(/\w+/g);
7184 22 May 23 nicklas 164       for (var i=0; i < ids.length; i++)
7184 22 May 23 nicklas 165       {
7184 22 May 23 nicklas 166         var sample = move.getSampleWithClarityId(ids[i]);
7184 22 May 23 nicklas 167         if (!sample) invalid[invalid.length]=ids[i];
7184 22 May 23 nicklas 168       }
7184 22 May 23 nicklas 169       if (invalid.length > 0)
7184 22 May 23 nicklas 170       {
7184 22 May 23 nicklas 171         missingSamplesIsValid = false;
7184 22 May 23 nicklas 172         Wizard.setInputStatus('missingSamples', 'invalid', 'Sample(s) "'+invalid.join(', ')+'" was not expected in this box');
7184 22 May 23 nicklas 173       }
7184 22 May 23 nicklas 174       else
7184 22 May 23 nicklas 175       {
7184 22 May 23 nicklas 176         Wizard.setInputStatus('missingSamples', 'valid');
7184 22 May 23 nicklas 177       }
7184 22 May 23 nicklas 178     }  
7184 22 May 23 nicklas 179   }
7184 22 May 23 nicklas 180   
7184 22 May 23 nicklas 181   
7184 22 May 23 nicklas 182   move.showMissingSamplesMenu = function(event)
7184 22 May 23 nicklas 183   {
7184 22 May 23 nicklas 184     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 185     // Mark items as selected in the menu
7184 22 May 23 nicklas 186     var missing = Strings.trim(frm.missingSamples.value).toUpperCase();
7184 22 May 23 nicklas 187     var ids = missing.match(/\w+/g) || [];
7184 22 May 23 nicklas 188     for (var i = 0; i < samples.length; i++)
7184 22 May 23 nicklas 189     {
7184 22 May 23 nicklas 190       var sample = samples[i];
7184 22 May 23 nicklas 191       Doc.addOrRemoveClass('sample-'+sample.id, 'is-selected', ids.indexOf(sample.clarityId)>=0);
7184 22 May 23 nicklas 192     }
7184 22 May 23 nicklas 193     var menu = Doc.element('select-missing-sample');
7184 22 May 23 nicklas 194     var x = event.clientX;
7184 22 May 23 nicklas 195     var y = event.clientY+2;
7184 22 May 23 nicklas 196     menu.style.display = 'block';
7184 22 May 23 nicklas 197     menu.style.left = (x)+'px';
7184 22 May 23 nicklas 198     menu.style.top = (y)+'px';
7184 22 May 23 nicklas 199     event.stopPropagation();
7184 22 May 23 nicklas 200   }
7184 22 May 23 nicklas 201   
7184 22 May 23 nicklas 202   move.missingSampleSelected = function(event)
7184 22 May 23 nicklas 203   {
7184 22 May 23 nicklas 204     var target = event.target;
7184 22 May 23 nicklas 205     if (target.tagName != 'DIV') target = target.parentNode;
7184 22 May 23 nicklas 206     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 207     var clarityId = Data.get(target, 'clarity-id');
7184 22 May 23 nicklas 208     if (!clarityId) return;
7184 22 May 23 nicklas 209     
7184 22 May 23 nicklas 210     var missing = frm.missingSamples.value;
7184 22 May 23 nicklas 211     var found = missing.indexOf(clarityId);
7184 22 May 23 nicklas 212     if (found >= 0)
7184 22 May 23 nicklas 213     {
7184 22 May 23 nicklas 214       missing = missing.substring(0, found)+missing.substring(found+clarityId.length);
7184 22 May 23 nicklas 215       missing = missing.replace(/\s\s/g, ' ').trim();
7184 22 May 23 nicklas 216     }
7184 22 May 23 nicklas 217     else
7184 22 May 23 nicklas 218     {
7184 22 May 23 nicklas 219       if (missing.length > 0 && missing.charAt(missing.length-1)!=' ')
7184 22 May 23 nicklas 220       {
7184 22 May 23 nicklas 221         missing+=' ';
7184 22 May 23 nicklas 222       }
7184 22 May 23 nicklas 223       missing += clarityId;  
7184 22 May 23 nicklas 224     }
7184 22 May 23 nicklas 225     frm.missingSamples.value = missing;
7184 22 May 23 nicklas 226     Events.sendChangeEvent('missingSamples');
7184 22 May 23 nicklas 227   }
7184 22 May 23 nicklas 228   
7184 22 May 23 nicklas 229   move.hideMissingSampleMenu = function()
7184 22 May 23 nicklas 230   {
7184 22 May 23 nicklas 231     Doc.hide('select-missing-sample');
7184 22 May 23 nicklas 232   }
7184 22 May 23 nicklas 233   
7184 22 May 23 nicklas 234   move.extraSamplesOnChange = function()
7184 22 May 23 nicklas 235   {
7184 22 May 23 nicklas 236     var frm = document.forms['reggie'];
7184 22 May 23 nicklas 237     
7184 22 May 23 nicklas 238     Wizard.setInputStatus('extraSamples');
7184 22 May 23 nicklas 239     extraSamplesIsValid = true;
7184 22 May 23 nicklas 240     var extra = Strings.trim(frm.extraSamples.value).toUpperCase();
7184 22 May 23 nicklas 241     
7184 22 May 23 nicklas 242     if (extra != '')
7184 22 May 23 nicklas 243     {
7184 22 May 23 nicklas 244       var noMatchingPrefix = [];
7184 22 May 23 nicklas 245       var matchedSamples = [];
7184 22 May 23 nicklas 246       var ids = extra.match(/\w+/g);
7184 22 May 23 nicklas 247       for (var i=0; i < ids.length; i++)
7184 22 May 23 nicklas 248       {
7184 22 May 23 nicklas 249         var id = ids[i];
7184 22 May 23 nicklas 250         if (move.getSampleWithClarityId(id))
7184 22 May 23 nicklas 251         {
7184 22 May 23 nicklas 252           matchedSamples[matchedSamples.length]=id;
7184 22 May 23 nicklas 253         }
7184 22 May 23 nicklas 254         else if (!move.isMatchingPrefix(id))
7184 22 May 23 nicklas 255         {
7184 22 May 23 nicklas 256           noMatchingPrefix[noMatchingPrefix.length] = id;
7184 22 May 23 nicklas 257         }
7184 22 May 23 nicklas 258       }
7184 22 May 23 nicklas 259       if (matchedSamples.length > 0)
7184 22 May 23 nicklas 260       {
7184 22 May 23 nicklas 261         extraSamplesIsValid = false;
7184 22 May 23 nicklas 262         Wizard.setInputStatus('extraSamples', 'invalid', 'Sample(s) "'+matchedSamples.join(', ')+'" are expected in this transport box');
7184 22 May 23 nicklas 263       }
7184 22 May 23 nicklas 264       else if (noMatchingPrefix.length > 0)
7184 22 May 23 nicklas 265       {
7184 22 May 23 nicklas 266         Wizard.setInputStatus('extraSamples', 'warning', 'Sample(s) "'+noMatchingPrefix.join(', ')+'" has unexpected prefix. Expected one of: '+prefixes.join(', '));
7184 22 May 23 nicklas 267       }
7184 22 May 23 nicklas 268       else
7184 22 May 23 nicklas 269       {
7184 22 May 23 nicklas 270         Wizard.setInputStatus('extraSamples', 'valid');
7184 22 May 23 nicklas 271       }
7184 22 May 23 nicklas 272     }
7184 22 May 23 nicklas 273     
7184 22 May 23 nicklas 274   }
7184 22 May 23 nicklas 275   
7184 22 May 23 nicklas 276   move.getSampleWithClarityId = function(clarityId)
7184 22 May 23 nicklas 277   {
7184 22 May 23 nicklas 278     for (var sampleNo = 0; sampleNo < samples.length; sampleNo++)
7184 22 May 23 nicklas 279     {
7184 22 May 23 nicklas 280       var s = samples[sampleNo];
7184 22 May 23 nicklas 281       if (s.clarityId == clarityId) return s;
7184 22 May 23 nicklas 282     }
7184 22 May 23 nicklas 283     return null;
7184 22 May 23 nicklas 284   }
7184 22 May 23 nicklas 285   
7184 22 May 23 nicklas 286   move.isMatchingPrefix = function(clarityId)
7184 22 May 23 nicklas 287   {
7184 22 May 23 nicklas 288     for (var prefixNo = 0; prefixNo < prefixes.length; prefixNo++)
7184 22 May 23 nicklas 289     {
7184 22 May 23 nicklas 290       if (clarityId.indexOf(prefixes[prefixNo]) == 0) return true;
7184 22 May 23 nicklas 291     }
7184 22 May 23 nicklas 292     return false;
7184 22 May 23 nicklas 293   }
7184 22 May 23 nicklas 294   
7184 22 May 23 nicklas 295   move.validateStep2 = function(event)
7184 22 May 23 nicklas 296   {
7184 22 May 23 nicklas 297     var valid = true;
7184 22 May 23 nicklas 298     valid &= Wizard.isValid('moveDate');
7184 22 May 23 nicklas 299     valid &= missingSamplesIsValid;
7184 22 May 23 nicklas 300     valid &= extraSamplesIsValid;
7184 22 May 23 nicklas 301     if (!valid) event.preventDefault();
7184 22 May 23 nicklas 302   }
7184 22 May 23 nicklas 303   
7184 22 May 23 nicklas 304   move.submit = function()
7184 22 May 23 nicklas 305   {
7186 22 May 23 nicklas 306     var frm = document.forms['reggie'];
7186 22 May 23 nicklas 307     var submitInfo = {};
7184 22 May 23 nicklas 308     
7186 22 May 23 nicklas 309     submitInfo.transportBox = parseInt(frm.transportBox.value);
7186 22 May 23 nicklas 310     submitInfo.moveDate = frm.moveDate.value;
7186 22 May 23 nicklas 311     submitInfo.moveOperator = frm.moveOperator.value;
7186 22 May 23 nicklas 312     submitInfo.extraSamples = frm.extraSamples.value;
7186 22 May 23 nicklas 313     submitInfo.comments = frm.comments.value;
7186 22 May 23 nicklas 314     
7186 22 May 23 nicklas 315     var missingSamples = [];
7186 22 May 23 nicklas 316     submitInfo.missingSamples = missingSamples;
7186 22 May 23 nicklas 317     
7186 22 May 23 nicklas 318     var missing = Strings.trim(frm.missingSamples.value).toUpperCase();
7186 22 May 23 nicklas 319     if (missing != '')
7186 22 May 23 nicklas 320     {
7186 22 May 23 nicklas 321       var ids = missing.match(/\w+/g);
7186 22 May 23 nicklas 322       for (var i=0; i < ids.length; i++)
7186 22 May 23 nicklas 323       {
7195 24 May 23 nicklas 324         var clarityId = ids[i];
7195 24 May 23 nicklas 325         var sample = move.getSampleWithClarityId(clarityId);
7195 24 May 23 nicklas 326         var tmp = {};
7195 24 May 23 nicklas 327         tmp.id = sample.id;
7195 24 May 23 nicklas 328         tmp.clarityId = clarityId;
7195 24 May 23 nicklas 329         missingSamples[missingSamples.length] = tmp;
7186 22 May 23 nicklas 330       }
7186 22 May 23 nicklas 331     }
7186 22 May 23 nicklas 332     
7186 22 May 23 nicklas 333     var url = '../ExternalSpecimen.servlet?ID='+App.getSessionId();
7186 22 May 23 nicklas 334     url += '&cmd=RegisterMoveComplete';
7186 22 May 23 nicklas 335     Wizard.showLoadingAnimation('Performing registration...');
7186 22 May 23 nicklas 336     Wizard.asyncJsonRequest(url, move.submissionResults, 'POST', JSON.stringify(submitInfo));
7184 22 May 23 nicklas 337   }
7184 22 May 23 nicklas 338   
7186 22 May 23 nicklas 339   move.submissionResults = function(response)
7186 22 May 23 nicklas 340   {
7186 22 May 23 nicklas 341     Wizard.showFinalMessage(response.messages);
7186 22 May 23 nicklas 342     Doc.show('gorestart');
7186 22 May 23 nicklas 343   }
7184 22 May 23 nicklas 344   
7184 22 May 23 nicklas 345   return move;
7184 22 May 23 nicklas 346 }();
7184 22 May 23 nicklas 347
7184 22 May 23 nicklas 348 Doc.onLoad(Move.initPage);