2832 |
20 Oct 14 |
nicklas |
var Histology = function() |
2832 |
20 Oct 14 |
nicklas |
2 |
{ |
2832 |
20 Oct 14 |
nicklas |
var histology = {}; |
2853 |
23 Oct 14 |
nicklas |
var debug = 0; |
2832 |
20 Oct 14 |
nicklas |
5 |
|
2832 |
20 Oct 14 |
nicklas |
var SCORES = ['ScoreInvasiveCancer', 'ScoreInsituCancer', 'ScoreLymphocytes', 'ScoreNormal', 'ScoreStroma', 'ScoreFat']; |
2832 |
20 Oct 14 |
nicklas |
var FIELDS = ['score_invasive_cancer', 'score_insitu_cancer', 'score_lymphocytes', 'score_normal', 'score_stroma', 'score_fat']; |
2832 |
20 Oct 14 |
nicklas |
8 |
|
2832 |
20 Oct 14 |
nicklas |
var heGlass; |
2832 |
20 Oct 14 |
nicklas |
var samples; |
2832 |
20 Oct 14 |
nicklas |
var selectedSample; |
2832 |
20 Oct 14 |
nicklas |
var disableModificationCheck = false; |
2832 |
20 Oct 14 |
nicklas |
13 |
|
2832 |
20 Oct 14 |
nicklas |
// Page initialization |
2832 |
20 Oct 14 |
nicklas |
histology.initPage = function() |
2832 |
20 Oct 14 |
nicklas |
16 |
{ |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('btnFindHeGlass', 'click', histology.searchHeGlass); |
2832 |
20 Oct 14 |
nicklas |
Events.doOnEnter('findHeGlassName', histology.searchHeGlass); |
2832 |
20 Oct 14 |
nicklas |
Buttons.addClickHandler('btnUncompletedHeGlass', histology.showUncompletedHeGlassMenu); |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('select-uncompleted-heglass', 'click', histology.uncompletedGlassSelected); |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('wizard', 'click', histology.hideUncompletedHeGlassMenu); |
2832 |
20 Oct 14 |
nicklas |
Buttons.addClickHandler('btnSelectHeGlass', histology.selectHeGlass); |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('btnSelectHeGlass', 'base-selected', histology.heGlassSelected); |
2832 |
20 Oct 14 |
nicklas |
24 |
|
2832 |
20 Oct 14 |
nicklas |
for (var i = 0; i < FIELDS.length; i++) |
2832 |
20 Oct 14 |
nicklas |
26 |
{ |
2832 |
20 Oct 14 |
nicklas |
var f = FIELDS[i]; |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler(f, 'keypress', Events.integerOnly); |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler(f, 'change', histology.checkScores); |
2832 |
20 Oct 14 |
nicklas |
30 |
} |
2832 |
20 Oct 14 |
nicklas |
31 |
|
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('good_stain', 'click', histology.goodStainOnClick); |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('score_complete', 'click', histology.scoreCompleteOnClick); |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('comments', 'change', histology.commentsOnChange); |
2832 |
20 Oct 14 |
nicklas |
35 |
|
3169 |
06 Mar 15 |
nicklas |
Events.addEventHandler('ihc_quality', 'change', histology.ihcQualityOnChange); |
3169 |
06 Mar 15 |
nicklas |
37 |
|
3369 |
08 Jun 15 |
nicklas |
// Image selection - drag/drop |
3367 |
05 Jun 15 |
nicklas |
Events.addEventHandler('he-file-drop', 'drop', histology.onDropFile); |
3367 |
05 Jun 15 |
nicklas |
Events.addEventHandler('he-file-drop', 'dragenter', histology.onDragEnter); |
3367 |
05 Jun 15 |
nicklas |
Events.addEventHandler('he-file-drop', 'dragleave', histology.onDragLeave); |
3367 |
05 Jun 15 |
nicklas |
Events.addEventHandler('he-file-drop', 'dragover', histology.onDragOver); |
3369 |
08 Jun 15 |
nicklas |
43 |
|
3369 |
08 Jun 15 |
nicklas |
// Image selection - regular selection via dialog |
3369 |
08 Jun 15 |
nicklas |
Events.addEventHandler('no-he-image', 'click', histology.selectFile); |
3369 |
08 Jun 15 |
nicklas |
Events.addEventHandler('selectFile', 'change', histology.fileSelected); |
3367 |
05 Jun 15 |
nicklas |
47 |
|
6016 |
09 Oct 20 |
nicklas |
// Image selection - copy/paste |
6016 |
09 Oct 20 |
nicklas |
Events.addEventHandler(document, 'paste', histology.pasteImage); |
6016 |
09 Oct 20 |
nicklas |
50 |
|
3369 |
08 Jun 15 |
nicklas |
// Delete image |
3369 |
08 Jun 15 |
nicklas |
Events.addEventHandler('he-image-delete', 'click', histology.deleteImage); |
3369 |
08 Jun 15 |
nicklas |
53 |
|
3369 |
08 Jun 15 |
nicklas |
// Zoom in popup window |
3369 |
08 Jun 15 |
nicklas |
Events.addEventHandler('he-image', 'click', histology.imageOnClick); |
3369 |
08 Jun 15 |
nicklas |
56 |
|
2832 |
20 Oct 14 |
nicklas |
// Navigation |
2832 |
20 Oct 14 |
nicklas |
Buttons.addClickHandler('gonext', histology.goNext); |
2832 |
20 Oct 14 |
nicklas |
Buttons.addClickHandler('goregister', Wizard.goRegister); |
2832 |
20 Oct 14 |
nicklas |
60 |
|
2832 |
20 Oct 14 |
nicklas |
// Final registration |
2832 |
20 Oct 14 |
nicklas |
Events.addEventHandler('wizard', 'wizard-submit', histology.submit); |
2832 |
20 Oct 14 |
nicklas |
63 |
|
2832 |
20 Oct 14 |
nicklas |
var url = '../Histology.servlet?ID='+App.getSessionId(); |
2832 |
20 Oct 14 |
nicklas |
url += '&cmd=GetHeGlassToScore'; |
2832 |
20 Oct 14 |
nicklas |
var glassName = Data.get('page-data', 'he-glass'); |
2832 |
20 Oct 14 |
nicklas |
if (glassName) url += '&name='+encodeURIComponent(glassName); |
2832 |
20 Oct 14 |
nicklas |
68 |
|
2832 |
20 Oct 14 |
nicklas |
Wizard.showLoadingAnimation(glassName ? 'Finding HE glass: '+Strings.encodeTags(glassName) : 'Loading next HE glass for scoring...'); |
2832 |
20 Oct 14 |
nicklas |
Wizard.asyncJsonRequest(url, histology.heGlassLoaded); |
2832 |
20 Oct 14 |
nicklas |
71 |
} |
2832 |
20 Oct 14 |
nicklas |
72 |
|
2832 |
20 Oct 14 |
nicklas |
histology.heGlassLoaded = function(response) |
2832 |
20 Oct 14 |
nicklas |
74 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glassName = response.name; |
2832 |
20 Oct 14 |
nicklas |
heGlass = response.heGlasses; |
2832 |
20 Oct 14 |
nicklas |
77 |
|
2832 |
20 Oct 14 |
nicklas |
Doc.show('step-1'); |
2832 |
20 Oct 14 |
nicklas |
79 |
|
2832 |
20 Oct 14 |
nicklas |
if (heGlass.length > 0) |
2832 |
20 Oct 14 |
nicklas |
81 |
{ |
2832 |
20 Oct 14 |
nicklas |
// Generate HE glass HTML |
2832 |
20 Oct 14 |
nicklas |
var html = ''; |
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < heGlass.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
85 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = heGlass[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
html += histology.createHeGlassSection(glass); |
2832 |
20 Oct 14 |
nicklas |
88 |
} |
2832 |
20 Oct 14 |
nicklas |
Doc.element('he-glass-container').innerHTML = html; |
2832 |
20 Oct 14 |
nicklas |
Doc.show('he-glass-container'); |
2832 |
20 Oct 14 |
nicklas |
91 |
|
6017 |
09 Oct 20 |
nicklas |
// Add handlers for viewing NDPI images |
6017 |
09 Oct 20 |
nicklas |
var images = document.getElementsByClassName('ndpi-image'); |
6017 |
09 Oct 20 |
nicklas |
for (var i = 0; i < images.length; i++) |
6017 |
09 Oct 20 |
nicklas |
95 |
{ |
6055 |
13 Nov 20 |
nicklas |
Events.addEventHandler(images[i], 'click', histology.previewNdpi); |
6055 |
13 Nov 20 |
nicklas |
97 |
} |
6055 |
13 Nov 20 |
nicklas |
var images = document.getElementsByClassName('open-ndpi'); |
6055 |
13 Nov 20 |
nicklas |
for (var i = 0; i < images.length; i++) |
6055 |
13 Nov 20 |
nicklas |
100 |
{ |
6017 |
09 Oct 20 |
nicklas |
Events.addEventHandler(images[i], 'click', Files.viewFileOnClick); |
6017 |
09 Oct 20 |
nicklas |
102 |
} |
6017 |
09 Oct 20 |
nicklas |
103 |
|
2832 |
20 Oct 14 |
nicklas |
// Fill form with know information |
2832 |
20 Oct 14 |
nicklas |
var firstGoodSample; |
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < heGlass.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
107 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = heGlass[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
for (var sampleNo = 0; sampleNo < glass.samples.length; sampleNo++) |
2832 |
20 Oct 14 |
nicklas |
110 |
{ |
2832 |
20 Oct 14 |
nicklas |
var sample = glass.samples[sampleNo]; |
2832 |
20 Oct 14 |
nicklas |
112 |
|
2832 |
20 Oct 14 |
nicklas |
histology.saveOriginalProperties(sample); |
2832 |
20 Oct 14 |
nicklas |
histology.restoreFromLocalStorage(sample); |
2832 |
20 Oct 14 |
nicklas |
115 |
|
2832 |
20 Oct 14 |
nicklas |
// Save ID of HE glass since we need that later |
2832 |
20 Oct 14 |
nicklas |
sample.heGlassId = glass.id; |
3125 |
09 Feb 15 |
nicklas |
sample.IHC = glass.IHC; |
2832 |
20 Oct 14 |
nicklas |
119 |
|
2832 |
20 Oct 14 |
nicklas |
// Save the first GoodStain sample so we can select it later |
2832 |
20 Oct 14 |
nicklas |
if (sample.GoodStain) |
2832 |
20 Oct 14 |
nicklas |
122 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (firstGoodSample == null) firstGoodSample = sample; |
2832 |
20 Oct 14 |
nicklas |
124 |
} |
2832 |
20 Oct 14 |
nicklas |
125 |
|
2832 |
20 Oct 14 |
nicklas |
126 |
|
2832 |
20 Oct 14 |
nicklas |
// Generate text inside table cell |
3367 |
05 Jun 15 |
nicklas |
var html = '<div>'; |
3367 |
05 Jun 15 |
nicklas |
html += '<div class="sample-name">'+Strings.encodeTags(sample.name.replace(/\.he\d+$/, ''))+'</div>'; |
3125 |
09 Feb 15 |
nicklas |
if (sample.IHC == null || sample.GoodStain) |
3125 |
09 Feb 15 |
nicklas |
131 |
{ |
3125 |
09 Feb 15 |
nicklas |
// Calculate sum of scores |
3125 |
09 Feb 15 |
nicklas |
var total = histology.calculateTotalScore(sample); |
3125 |
09 Feb 15 |
nicklas |
html += '<div class="progress" id="'+sample.id+'.progress">' + total + '%</div>'; |
3125 |
09 Feb 15 |
nicklas |
135 |
} |
3125 |
09 Feb 15 |
nicklas |
else |
3125 |
09 Feb 15 |
nicklas |
137 |
{ |
3169 |
06 Mar 15 |
nicklas |
html += '<div class="progress" id="'+sample.id+'.progress">' + Strings.encodeTags(sample.IHC + ': ' + (sample.IHCQuality || '?')) + '</div>'; |
3125 |
09 Feb 15 |
nicklas |
139 |
} |
3367 |
05 Jun 15 |
nicklas |
html += '<div class="thumbnail"></div>'; |
3367 |
05 Jun 15 |
nicklas |
html += '</div>'; |
2832 |
20 Oct 14 |
nicklas |
142 |
|
2832 |
20 Oct 14 |
nicklas |
var td = Doc.element(sample.heGlassId+'-'+sample.well.location); |
2832 |
20 Oct 14 |
nicklas |
td.innerHTML = html; |
2832 |
20 Oct 14 |
nicklas |
td.sample = sample; |
3125 |
09 Feb 15 |
nicklas |
146 |
|
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(sample); |
3125 |
09 Feb 15 |
nicklas |
if (sample.IHC == null || sample.GoodStain) |
3125 |
09 Feb 15 |
nicklas |
149 |
{ |
3125 |
09 Feb 15 |
nicklas |
Events.addEventHandler(td, 'click', histology.sampleOnClick); |
3125 |
09 Feb 15 |
nicklas |
151 |
} |
3169 |
06 Mar 15 |
nicklas |
else |
3169 |
06 Mar 15 |
nicklas |
153 |
{ |
3169 |
06 Mar 15 |
nicklas |
Events.addEventHandler(td, 'click', histology.ihcOnClick); |
3169 |
06 Mar 15 |
nicklas |
155 |
} |
2832 |
20 Oct 14 |
nicklas |
156 |
} |
2832 |
20 Oct 14 |
nicklas |
157 |
} |
2832 |
20 Oct 14 |
nicklas |
158 |
|
2832 |
20 Oct 14 |
nicklas |
if (firstGoodSample != null) |
2832 |
20 Oct 14 |
nicklas |
160 |
{ |
2832 |
20 Oct 14 |
nicklas |
Doc.show('score-container'); |
2832 |
20 Oct 14 |
nicklas |
histology.selectSample(firstGoodSample); |
2832 |
20 Oct 14 |
nicklas |
163 |
} |
2832 |
20 Oct 14 |
nicklas |
164 |
|
3368 |
08 Jun 15 |
nicklas |
if (heGlass.length > 3) |
3368 |
08 Jun 15 |
nicklas |
166 |
{ |
3368 |
08 Jun 15 |
nicklas |
// To make sure the image does not scroll out of view |
3368 |
08 Jun 15 |
nicklas |
Doc.addClass('he-layout', 'many-he-glass'); |
3368 |
08 Jun 15 |
nicklas |
169 |
} |
3368 |
08 Jun 15 |
nicklas |
170 |
|
2832 |
20 Oct 14 |
nicklas |
Wizard.keepSessionAlive(); |
2832 |
20 Oct 14 |
nicklas |
Doc.show('goregister'); |
2832 |
20 Oct 14 |
nicklas |
window.addEventListener('beforeunload', histology.confirmLeaveWizard); |
2832 |
20 Oct 14 |
nicklas |
174 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
176 |
{ |
2832 |
20 Oct 14 |
nicklas |
var msg; |
2832 |
20 Oct 14 |
nicklas |
if (glassName) |
2832 |
20 Oct 14 |
nicklas |
179 |
{ |
2832 |
20 Oct 14 |
nicklas |
msg = 'Could not find HE glass with name: ' + Strings.encodeTags(glassName); |
2832 |
20 Oct 14 |
nicklas |
181 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
183 |
{ |
2832 |
20 Oct 14 |
nicklas |
msg = 'No HE glass available for scoring.'; |
2832 |
20 Oct 14 |
nicklas |
msg += ' Specify HE glass name above to re-score.'; |
2832 |
20 Oct 14 |
nicklas |
186 |
} |
2832 |
20 Oct 14 |
nicklas |
Doc.element('he-glass-container').innerHTML = '<div class="messagecontainer note">'+msg+'</div>'; |
2832 |
20 Oct 14 |
nicklas |
Doc.show('he-glass-container'); |
2832 |
20 Oct 14 |
nicklas |
Doc.show('gonext'); |
2832 |
20 Oct 14 |
nicklas |
190 |
} |
2832 |
20 Oct 14 |
nicklas |
191 |
|
2832 |
20 Oct 14 |
nicklas |
192 |
|
2832 |
20 Oct 14 |
nicklas |
var url = '../Histology.servlet?ID='+App.getSessionId(); |
2832 |
20 Oct 14 |
nicklas |
url += '&cmd=GetUncompletedHeGlass'; |
2832 |
20 Oct 14 |
nicklas |
Wizard.asyncJsonRequest(url, histology.uncompletedHeGlassLoaded); |
2832 |
20 Oct 14 |
nicklas |
196 |
} |
2832 |
20 Oct 14 |
nicklas |
197 |
|
6055 |
13 Nov 20 |
nicklas |
198 |
/** |
6055 |
13 Nov 20 |
nicklas |
Show a preview of either the label or the scanned area. |
6055 |
13 Nov 20 |
nicklas |
200 |
*/ |
6055 |
13 Nov 20 |
nicklas |
histology.previewNdpi = function(event) |
6055 |
13 Nov 20 |
nicklas |
202 |
{ |
6055 |
13 Nov 20 |
nicklas |
var img = event.currentTarget; |
6055 |
13 Nov 20 |
nicklas |
// Find out the 'x' coordinage of the mouse click |
6055 |
13 Nov 20 |
nicklas |
var bounds = img.getBoundingClientRect(); |
6055 |
13 Nov 20 |
nicklas |
var left = bounds.left; |
6055 |
13 Nov 20 |
nicklas |
var height = img.clientHeight; |
6055 |
13 Nov 20 |
nicklas |
var x = event.pageX - left; |
6055 |
13 Nov 20 |
nicklas |
209 |
|
6055 |
13 Nov 20 |
nicklas |
var fileId = Data.get(img, 'file-id'); |
6055 |
13 Nov 20 |
nicklas |
var url = '../../thumbnails.jar/Thumbnails.servlet?ID='+App.getSessionId()+'&file='+fileId+'&size=XXLARGE'; |
6055 |
13 Nov 20 |
nicklas |
if (x < height) |
6055 |
13 Nov 20 |
nicklas |
213 |
{ |
6055 |
13 Nov 20 |
nicklas |
// The click was to the left, display the label (we know that it is at image index 7) |
6055 |
13 Nov 20 |
nicklas |
url += '&index=7&crop=LABEL'; |
6055 |
13 Nov 20 |
nicklas |
216 |
} |
6055 |
13 Nov 20 |
nicklas |
else |
6055 |
13 Nov 20 |
nicklas |
218 |
{ |
6055 |
13 Nov 20 |
nicklas |
// The click was to the right, display the scanned area (the smallest image is at image index 6) |
6055 |
13 Nov 20 |
nicklas |
url += '&index=6'; |
6055 |
13 Nov 20 |
nicklas |
221 |
} |
6055 |
13 Nov 20 |
nicklas |
Doc.element('he-image-name').innerHTML = Data.get(img, 'glass-name'); |
6055 |
13 Nov 20 |
nicklas |
Doc.hide('file-error'); |
6055 |
13 Nov 20 |
nicklas |
Doc.addClass('he-image-container', 'has-image'); |
6055 |
13 Nov 20 |
nicklas |
Doc.removeClass('he-image-container', 'can-delete'); |
6055 |
13 Nov 20 |
nicklas |
Data.set('he-image', 'file-id', fileId); |
6055 |
13 Nov 20 |
nicklas |
Doc.element('he-image').src = '../images/loading.gif'; |
6055 |
13 Nov 20 |
nicklas |
Doc.element('he-image').src = url; |
6055 |
13 Nov 20 |
nicklas |
229 |
} |
6055 |
13 Nov 20 |
nicklas |
230 |
|
2832 |
20 Oct 14 |
nicklas |
histology.uncompletedHeGlassLoaded = function(response) |
2832 |
20 Oct 14 |
nicklas |
232 |
{ |
2832 |
20 Oct 14 |
nicklas |
var uncompleted = response.heGlasses; |
2832 |
20 Oct 14 |
nicklas |
234 |
|
2832 |
20 Oct 14 |
nicklas |
if (uncompleted.length > 0) |
2832 |
20 Oct 14 |
nicklas |
236 |
{ |
2832 |
20 Oct 14 |
nicklas |
// Populate menu item |
2832 |
20 Oct 14 |
nicklas |
Doc.element('btnUncompletedHeGlass.text').innerHTML = uncompleted.length + ' uncompleted'; |
2832 |
20 Oct 14 |
nicklas |
var html = ''; |
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < uncompleted.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
241 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = uncompleted[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
243 |
|
3125 |
09 Feb 15 |
nicklas |
html += '<div class="menuitem enabled interactable" id="glass-'+glass.id+'" data-name="'+Strings.encodeTags(glass.name)+'">'; |
2832 |
20 Oct 14 |
nicklas |
html += Strings.encodeTags(glass.name)+' ('+glass.numUncompleteSamples +')</div>'; |
2832 |
20 Oct 14 |
nicklas |
246 |
} |
2832 |
20 Oct 14 |
nicklas |
Doc.element('select-uncompleted-heglass-menu').innerHTML = html; |
2832 |
20 Oct 14 |
nicklas |
Doc.show('btnNncompletedHeGlass'); |
2832 |
20 Oct 14 |
nicklas |
249 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
251 |
{ |
2832 |
20 Oct 14 |
nicklas |
Doc.hide('btnUncompletedHeGlass'); |
2832 |
20 Oct 14 |
nicklas |
253 |
} |
2832 |
20 Oct 14 |
nicklas |
254 |
} |
2832 |
20 Oct 14 |
nicklas |
255 |
|
2832 |
20 Oct 14 |
nicklas |
histology.showUncompletedHeGlassMenu = function(event) |
2832 |
20 Oct 14 |
nicklas |
257 |
{ |
2832 |
20 Oct 14 |
nicklas |
var pos = Doc.getElementPosition('btnUncompletedHeGlass'); |
2832 |
20 Oct 14 |
nicklas |
var x = pos.left; |
2832 |
20 Oct 14 |
nicklas |
var y = pos.top+pos.height; |
2832 |
20 Oct 14 |
nicklas |
261 |
|
2832 |
20 Oct 14 |
nicklas |
var menu = Doc.element('select-uncompleted-heglass'); |
2832 |
20 Oct 14 |
nicklas |
menu.style.left = (x)+'px'; |
2832 |
20 Oct 14 |
nicklas |
menu.style.top = (y)+'px'; |
2832 |
20 Oct 14 |
nicklas |
menu.style.display = 'block'; |
2832 |
20 Oct 14 |
nicklas |
event.stopPropagation(); |
2832 |
20 Oct 14 |
nicklas |
267 |
} |
2832 |
20 Oct 14 |
nicklas |
268 |
|
6824 |
30 Aug 22 |
nicklas |
histology.hideUncompletedHeGlassMenu = function() |
2832 |
20 Oct 14 |
nicklas |
270 |
{ |
2832 |
20 Oct 14 |
nicklas |
Doc.hide('select-uncompleted-heglass'); |
2832 |
20 Oct 14 |
nicklas |
272 |
} |
2832 |
20 Oct 14 |
nicklas |
273 |
|
2832 |
20 Oct 14 |
nicklas |
histology.uncompletedGlassSelected = function(event) |
2832 |
20 Oct 14 |
nicklas |
275 |
{ |
2832 |
20 Oct 14 |
nicklas |
histology.findHeGlass(Data.get(event.target, 'name')); |
2832 |
20 Oct 14 |
nicklas |
277 |
} |
2832 |
20 Oct 14 |
nicklas |
278 |
|
2832 |
20 Oct 14 |
nicklas |
279 |
|
2832 |
20 Oct 14 |
nicklas |
histology.selectHeGlass = function(event) |
2832 |
20 Oct 14 |
nicklas |
281 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (!histology.confirmLeaveWizard()) return; |
2832 |
20 Oct 14 |
nicklas |
283 |
|
2832 |
20 Oct 14 |
nicklas |
var url = '&resetTemporary=1'; |
2832 |
20 Oct 14 |
nicklas |
url += '&tmpfilter:STRING:name='+encodeURIComponent('HE%'); |
2832 |
20 Oct 14 |
nicklas |
Dialogs.selectItem('BIOPLATE', event.currentTarget.id, 0, url); |
2832 |
20 Oct 14 |
nicklas |
287 |
} |
2832 |
20 Oct 14 |
nicklas |
288 |
|
2832 |
20 Oct 14 |
nicklas |
histology.heGlassSelected = function(event) |
2832 |
20 Oct 14 |
nicklas |
290 |
{ |
2832 |
20 Oct 14 |
nicklas |
disableModificationCheck = true; |
2832 |
20 Oct 14 |
nicklas |
histology.findHeGlass(event.detail.name); |
2832 |
20 Oct 14 |
nicklas |
293 |
} |
2832 |
20 Oct 14 |
nicklas |
294 |
|
6824 |
30 Aug 22 |
nicklas |
histology.searchHeGlass = function() |
2832 |
20 Oct 14 |
nicklas |
296 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
if (frm.findGlassName.value) histology.findHeGlass(); |
2832 |
20 Oct 14 |
nicklas |
299 |
} |
2832 |
20 Oct 14 |
nicklas |
300 |
|
2832 |
20 Oct 14 |
nicklas |
histology.findHeGlass = function(glassName, autoFind) |
2832 |
20 Oct 14 |
nicklas |
302 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
if (!glassName && autoFind != true) |
2832 |
20 Oct 14 |
nicklas |
305 |
{ |
2832 |
20 Oct 14 |
nicklas |
glassName = frm.findGlassName.value; |
2832 |
20 Oct 14 |
nicklas |
if (!glassName) return; |
2832 |
20 Oct 14 |
nicklas |
308 |
|
2832 |
20 Oct 14 |
nicklas |
if (glassName.match(/^\d+$/)) |
2832 |
20 Oct 14 |
nicklas |
310 |
{ |
2832 |
20 Oct 14 |
nicklas |
while (glassName.length < 5) |
2832 |
20 Oct 14 |
nicklas |
312 |
{ |
2832 |
20 Oct 14 |
nicklas |
glassName = '0'+glassName; |
2832 |
20 Oct 14 |
nicklas |
314 |
} |
2832 |
20 Oct 14 |
nicklas |
glassName = 'HE'+glassName; |
2832 |
20 Oct 14 |
nicklas |
316 |
} |
2832 |
20 Oct 14 |
nicklas |
317 |
} |
2832 |
20 Oct 14 |
nicklas |
var url = 'histology_score.jsp?ID='+App.getSessionId(); |
2832 |
20 Oct 14 |
nicklas |
if (glassName) |
2832 |
20 Oct 14 |
nicklas |
320 |
{ |
2832 |
20 Oct 14 |
nicklas |
url += '&name='+encodeURIComponent(glassName); |
2832 |
20 Oct 14 |
nicklas |
322 |
} |
2832 |
20 Oct 14 |
nicklas |
323 |
|
2832 |
20 Oct 14 |
nicklas |
location.replace(url); |
2832 |
20 Oct 14 |
nicklas |
325 |
} |
2832 |
20 Oct 14 |
nicklas |
326 |
|
2832 |
20 Oct 14 |
nicklas |
histology.goNext = function() |
2832 |
20 Oct 14 |
nicklas |
328 |
{ |
2832 |
20 Oct 14 |
nicklas |
histology.findHeGlass(null, true); |
2832 |
20 Oct 14 |
nicklas |
330 |
} |
2832 |
20 Oct 14 |
nicklas |
331 |
|
2832 |
20 Oct 14 |
nicklas |
histology.createHeGlassSection = function(glass) |
2832 |
20 Oct 14 |
nicklas |
333 |
{ |
2832 |
20 Oct 14 |
nicklas |
var html = ''; |
3026 |
11 Dec 14 |
nicklas |
html += '<div class="he-glass bg-filled-50">'; |
6017 |
09 Oct 20 |
nicklas |
html += '<div class="he-name bg-filled-100">'; |
6017 |
09 Oct 20 |
nicklas |
html += Strings.encodeTags(glass.name || ''); |
6017 |
09 Oct 20 |
nicklas |
html += '</div>'; |
2832 |
20 Oct 14 |
nicklas |
339 |
|
2832 |
20 Oct 14 |
nicklas |
html += '<div class="he-info">'; |
3125 |
09 Feb 15 |
nicklas |
if (glass.IHC != null) |
3125 |
09 Feb 15 |
nicklas |
342 |
{ |
3125 |
09 Feb 15 |
nicklas |
html += '<span class="ihc">' + Strings.encodeTags(glass.IHC) + '</span>; '; |
3125 |
09 Feb 15 |
nicklas |
344 |
} |
2832 |
20 Oct 14 |
nicklas |
html += '<span class="he-tray">' + Strings.encodeTags(glass.tray || '') + '</span>; <span class="he-position">' + Strings.encodeTags(glass.position || '') + '</span>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<div class="he-comment">' + Strings.encodeTags(glass.comments || '') + '</div>'; |
2832 |
20 Oct 14 |
nicklas |
html += '</div>'; |
6051 |
12 Nov 20 |
nicklas |
html += '<div class="he-thumb">'; |
6051 |
12 Nov 20 |
nicklas |
if (glass.ndpiImage) |
6051 |
12 Nov 20 |
nicklas |
350 |
{ |
6055 |
13 Nov 20 |
nicklas |
html += '<img class="ndpi-image link" title="Preview NanoZoomer Digital Pathology Image"'; |
6055 |
13 Nov 20 |
nicklas |
html += ' src="../../thumbnails.jar/Thumbnails.servlet?ID='+App.getSessionId()+'&file='+glass.ndpiImage.id+'&size=LARGE&index=7"'; |
6055 |
13 Nov 20 |
nicklas |
html += ' data-file-id="'+glass.ndpiImage.id+'" data-glass-name="'+Strings.encodeTags(glass.name)+'"'; |
6055 |
13 Nov 20 |
nicklas |
html += '>'; |
6055 |
13 Nov 20 |
nicklas |
html += '<img class="open-ndpi link" data-file-id="'+glass.ndpiImage.id+'" title="Download and open NanoZoomer Digital Pathology Image" src="../images/ndp.png">'; |
6051 |
12 Nov 20 |
nicklas |
356 |
} |
6051 |
12 Nov 20 |
nicklas |
else |
6051 |
12 Nov 20 |
nicklas |
358 |
{ |
6051 |
12 Nov 20 |
nicklas |
html += 'No scanned image exists for this slide'; |
6051 |
12 Nov 20 |
nicklas |
360 |
} |
6051 |
12 Nov 20 |
nicklas |
html += '</div>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<table class="he-table">'; |
2832 |
20 Oct 14 |
nicklas |
html += '<tr>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<td class="not-used" id="'+glass.id+'-A1"></td>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<td class="not-used" id="'+glass.id+'-A2"></td>'; |
2832 |
20 Oct 14 |
nicklas |
html += '</tr>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<tr>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<td class="not-used" id="'+glass.id+'-B1"></td>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<td class="not-used" id="'+glass.id+'-B2"></td>'; |
2832 |
20 Oct 14 |
nicklas |
html += '</tr>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<tr>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<td class="not-used" id="'+glass.id+'-C1"></td>'; |
2832 |
20 Oct 14 |
nicklas |
html += '<td class="not-used" id="'+glass.id+'-C2"></td>'; |
2832 |
20 Oct 14 |
nicklas |
html += '</tr>'; |
2832 |
20 Oct 14 |
nicklas |
html += '</table>'; |
2832 |
20 Oct 14 |
nicklas |
html += '</div>'; |
2832 |
20 Oct 14 |
nicklas |
377 |
|
2832 |
20 Oct 14 |
nicklas |
return html; |
2832 |
20 Oct 14 |
nicklas |
379 |
} |
2832 |
20 Oct 14 |
nicklas |
380 |
|
2832 |
20 Oct 14 |
nicklas |
381 |
/** |
2832 |
20 Oct 14 |
nicklas |
Remember the original properties so that we know if |
2832 |
20 Oct 14 |
nicklas |
a sample has been modified. |
2832 |
20 Oct 14 |
nicklas |
384 |
*/ |
2832 |
20 Oct 14 |
nicklas |
histology.saveOriginalProperties = function(sample) |
2832 |
20 Oct 14 |
nicklas |
386 |
{ |
2832 |
20 Oct 14 |
nicklas |
var o = {}; |
2832 |
20 Oct 14 |
nicklas |
for (var i = 0; i < SCORES.length; i++) |
2832 |
20 Oct 14 |
nicklas |
389 |
{ |
2832 |
20 Oct 14 |
nicklas |
var p = SCORES[i]; |
2832 |
20 Oct 14 |
nicklas |
o[p] = sample[p]; |
2832 |
20 Oct 14 |
nicklas |
392 |
} |
2832 |
20 Oct 14 |
nicklas |
393 |
|
2832 |
20 Oct 14 |
nicklas |
o.GoodStain = sample.GoodStain; |
2832 |
20 Oct 14 |
nicklas |
o.ScoreComplete = sample.ScoreComplete; |
2832 |
20 Oct 14 |
nicklas |
o.comments = sample.comments; |
3169 |
06 Mar 15 |
nicklas |
o.IHCQuality = sample.IHCQuality; |
2832 |
20 Oct 14 |
nicklas |
sample.o = o; |
2832 |
20 Oct 14 |
nicklas |
sample.isModified = false; |
2832 |
20 Oct 14 |
nicklas |
400 |
} |
2832 |
20 Oct 14 |
nicklas |
401 |
|
2832 |
20 Oct 14 |
nicklas |
402 |
/** |
2832 |
20 Oct 14 |
nicklas |
Check if a sample has been modified. |
2832 |
20 Oct 14 |
nicklas |
404 |
*/ |
2832 |
20 Oct 14 |
nicklas |
histology.isModified = function(sample, useCache) |
2832 |
20 Oct 14 |
nicklas |
406 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (!useCache) |
2832 |
20 Oct 14 |
nicklas |
408 |
{ |
2832 |
20 Oct 14 |
nicklas |
var o = sample.o; |
2832 |
20 Oct 14 |
nicklas |
sample.isModified = false; |
2832 |
20 Oct 14 |
nicklas |
for (var p in o) |
2832 |
20 Oct 14 |
nicklas |
412 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (o[p] != sample[p]) |
2832 |
20 Oct 14 |
nicklas |
414 |
{ |
2832 |
20 Oct 14 |
nicklas |
sample.isModified = true; |
2832 |
20 Oct 14 |
nicklas |
break; |
2832 |
20 Oct 14 |
nicklas |
417 |
} |
2832 |
20 Oct 14 |
nicklas |
418 |
} |
2832 |
20 Oct 14 |
nicklas |
419 |
} |
2832 |
20 Oct 14 |
nicklas |
return sample.isModified; |
2832 |
20 Oct 14 |
nicklas |
421 |
} |
2832 |
20 Oct 14 |
nicklas |
422 |
|
2832 |
20 Oct 14 |
nicklas |
423 |
|
2832 |
20 Oct 14 |
nicklas |
histology.calculateTotalScore = function(sample) |
2832 |
20 Oct 14 |
nicklas |
425 |
{ |
2832 |
20 Oct 14 |
nicklas |
var total = 0; |
2832 |
20 Oct 14 |
nicklas |
var numNull = 0; |
2832 |
20 Oct 14 |
nicklas |
for (var i = 0; i < SCORES.length; i++) |
2832 |
20 Oct 14 |
nicklas |
429 |
{ |
2832 |
20 Oct 14 |
nicklas |
var score = sample[SCORES[i]]; |
2832 |
20 Oct 14 |
nicklas |
total += histology.sumScore(score); |
2832 |
20 Oct 14 |
nicklas |
if (score == null) numNull++; |
2832 |
20 Oct 14 |
nicklas |
433 |
} |
2832 |
20 Oct 14 |
nicklas |
// Set summed total, null only if all values are null |
2832 |
20 Oct 14 |
nicklas |
sample.ScoreTotal = total == 0 && numNull == SCORES.length ? null : total; |
2832 |
20 Oct 14 |
nicklas |
sample.numNullScores = numNull; |
2832 |
20 Oct 14 |
nicklas |
return total; |
2832 |
20 Oct 14 |
nicklas |
438 |
} |
2832 |
20 Oct 14 |
nicklas |
439 |
|
2832 |
20 Oct 14 |
nicklas |
histology.sumScore = function(score) |
2832 |
20 Oct 14 |
nicklas |
441 |
{ |
2832 |
20 Oct 14 |
nicklas |
return score || 0; |
2832 |
20 Oct 14 |
nicklas |
443 |
} |
2832 |
20 Oct 14 |
nicklas |
444 |
|
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName = function(sample) |
2832 |
20 Oct 14 |
nicklas |
446 |
{ |
2832 |
20 Oct 14 |
nicklas |
var className = 'used'; |
2832 |
20 Oct 14 |
nicklas |
if (sample.GoodStain) |
2832 |
20 Oct 14 |
nicklas |
449 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' good-stain'; |
2832 |
20 Oct 14 |
nicklas |
451 |
} |
3125 |
09 Feb 15 |
nicklas |
else if (sample.IHC) |
3125 |
09 Feb 15 |
nicklas |
453 |
{ |
3125 |
09 Feb 15 |
nicklas |
className += ' ihc'; |
3406 |
16 Jun 15 |
nicklas |
if (sample.IHCQuality) |
3406 |
16 Jun 15 |
nicklas |
456 |
{ |
3406 |
16 Jun 15 |
nicklas |
className += ' ihc-done'; |
3406 |
16 Jun 15 |
nicklas |
458 |
} |
3125 |
09 Feb 15 |
nicklas |
459 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
461 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (histology.getGoodStainedSampleForLocation(sample.well.location) == null) |
2832 |
20 Oct 14 |
nicklas |
463 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' flag'; |
2832 |
20 Oct 14 |
nicklas |
465 |
} |
2832 |
20 Oct 14 |
nicklas |
466 |
} |
2832 |
20 Oct 14 |
nicklas |
467 |
|
2832 |
20 Oct 14 |
nicklas |
if (sample.ScoreTotal == null) |
2832 |
20 Oct 14 |
nicklas |
469 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' score-none'; |
2832 |
20 Oct 14 |
nicklas |
471 |
} |
2832 |
20 Oct 14 |
nicklas |
else if (sample.ScoreTotal != 100 || !sample.ScoreComplete) |
2832 |
20 Oct 14 |
nicklas |
473 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' score-incomplete'; |
2832 |
20 Oct 14 |
nicklas |
475 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
477 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' score-complete'; |
2832 |
20 Oct 14 |
nicklas |
479 |
} |
2832 |
20 Oct 14 |
nicklas |
480 |
|
3369 |
08 Jun 15 |
nicklas |
if (sample.image) |
3367 |
05 Jun 15 |
nicklas |
482 |
{ |
6055 |
13 Nov 20 |
nicklas |
className += ' has-image can-delete'; |
3367 |
05 Jun 15 |
nicklas |
484 |
} |
3367 |
05 Jun 15 |
nicklas |
485 |
|
2832 |
20 Oct 14 |
nicklas |
if (histology.isModified(sample)) |
2832 |
20 Oct 14 |
nicklas |
487 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' modified'; |
2832 |
20 Oct 14 |
nicklas |
489 |
} |
2832 |
20 Oct 14 |
nicklas |
490 |
|
2832 |
20 Oct 14 |
nicklas |
if (selectedSample && selectedSample.id == sample.id) |
2832 |
20 Oct 14 |
nicklas |
492 |
{ |
2832 |
20 Oct 14 |
nicklas |
className += ' selected'; |
2832 |
20 Oct 14 |
nicklas |
494 |
} |
2832 |
20 Oct 14 |
nicklas |
495 |
|
2832 |
20 Oct 14 |
nicklas |
var td = Doc.element(sample.heGlassId+'-'+sample.well.location); |
2832 |
20 Oct 14 |
nicklas |
td.className = className; |
2832 |
20 Oct 14 |
nicklas |
498 |
} |
2832 |
20 Oct 14 |
nicklas |
499 |
|
2832 |
20 Oct 14 |
nicklas |
histology.getGoodStainedSampleForLocation = function(location) |
2832 |
20 Oct 14 |
nicklas |
501 |
{ |
2832 |
20 Oct 14 |
nicklas |
// Find sample on given location that has GoodStain annotation |
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < heGlass.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
504 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = heGlass[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
for (var sampleNo = 0; sampleNo < glass.samples.length; sampleNo++) |
2832 |
20 Oct 14 |
nicklas |
507 |
{ |
2832 |
20 Oct 14 |
nicklas |
var sample = glass.samples[sampleNo]; |
2832 |
20 Oct 14 |
nicklas |
if (sample.well.location == location && sample.GoodStain) |
2832 |
20 Oct 14 |
nicklas |
510 |
{ |
2832 |
20 Oct 14 |
nicklas |
return sample; |
2832 |
20 Oct 14 |
nicklas |
512 |
} |
2832 |
20 Oct 14 |
nicklas |
513 |
} |
2832 |
20 Oct 14 |
nicklas |
514 |
} |
2832 |
20 Oct 14 |
nicklas |
return null; |
2832 |
20 Oct 14 |
nicklas |
516 |
} |
2832 |
20 Oct 14 |
nicklas |
517 |
|
2832 |
20 Oct 14 |
nicklas |
histology.sampleOnClick = function(event) |
2832 |
20 Oct 14 |
nicklas |
519 |
{ |
2832 |
20 Oct 14 |
nicklas |
var td = event.currentTarget; |
2832 |
20 Oct 14 |
nicklas |
histology.selectSample(td.sample); |
2832 |
20 Oct 14 |
nicklas |
522 |
} |
3169 |
06 Mar 15 |
nicklas |
523 |
|
3169 |
06 Mar 15 |
nicklas |
histology.ihcOnClick = function(event) |
3169 |
06 Mar 15 |
nicklas |
525 |
{ |
3169 |
06 Mar 15 |
nicklas |
var td = event.currentTarget; |
3169 |
06 Mar 15 |
nicklas |
histology.selectSample(td.sample); |
3169 |
06 Mar 15 |
nicklas |
528 |
} |
2832 |
20 Oct 14 |
nicklas |
529 |
|
2832 |
20 Oct 14 |
nicklas |
histology.selectSample = function(sample) |
2832 |
20 Oct 14 |
nicklas |
531 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
533 |
|
2832 |
20 Oct 14 |
nicklas |
// Sample name |
2832 |
20 Oct 14 |
nicklas |
Doc.element('sample.name').innerHTML = Strings.encodeTags(sample.name); |
2832 |
20 Oct 14 |
nicklas |
536 |
|
3169 |
06 Mar 15 |
nicklas |
if (sample.IHC) |
2832 |
20 Oct 14 |
nicklas |
538 |
{ |
3169 |
06 Mar 15 |
nicklas |
Doc.hide('heSample'); |
3169 |
06 Mar 15 |
nicklas |
Doc.show('ihcSample'); |
3169 |
06 Mar 15 |
nicklas |
541 |
|
3169 |
06 Mar 15 |
nicklas |
Forms.selectListOption(frm.ihc_quality, sample.IHCQuality || ''); |
3169 |
06 Mar 15 |
nicklas |
Doc.element('ihc_name').innerHTML = Strings.encodeTags(sample.IHC); |
2832 |
20 Oct 14 |
nicklas |
544 |
} |
3169 |
06 Mar 15 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
546 |
{ |
3169 |
06 Mar 15 |
nicklas |
Doc.show('heSample'); |
3169 |
06 Mar 15 |
nicklas |
Doc.hide('ihcSample'); |
3169 |
06 Mar 15 |
nicklas |
549 |
|
3169 |
06 Mar 15 |
nicklas |
// Scores |
3169 |
06 Mar 15 |
nicklas |
for (var i = 0; i < SCORES.length; i++) |
2832 |
20 Oct 14 |
nicklas |
552 |
{ |
3169 |
06 Mar 15 |
nicklas |
frm[FIELDS[i]].value = sample[SCORES[i]]; |
2832 |
20 Oct 14 |
nicklas |
554 |
} |
3169 |
06 Mar 15 |
nicklas |
555 |
|
3169 |
06 Mar 15 |
nicklas |
// Total score + score complete |
3169 |
06 Mar 15 |
nicklas |
var total = histology.calculateTotalScore(sample); |
3169 |
06 Mar 15 |
nicklas |
Doc.element('score_total').innerHTML = total; |
3169 |
06 Mar 15 |
nicklas |
if (total == 100) |
3169 |
06 Mar 15 |
nicklas |
560 |
{ |
3169 |
06 Mar 15 |
nicklas |
if (sample.numNullScores == 0) |
3169 |
06 Mar 15 |
nicklas |
562 |
{ |
3169 |
06 Mar 15 |
nicklas |
frm.score_complete.disabled = false; |
3169 |
06 Mar 15 |
nicklas |
frm.score_complete.checked = sample.ScoreComplete; |
3169 |
06 Mar 15 |
nicklas |
Wizard.setInputStatus('score_total', 'valid'); |
3169 |
06 Mar 15 |
nicklas |
566 |
} |
3169 |
06 Mar 15 |
nicklas |
else |
3169 |
06 Mar 15 |
nicklas |
568 |
{ |
3169 |
06 Mar 15 |
nicklas |
frm.score_complete.disabled = true; |
3169 |
06 Mar 15 |
nicklas |
frm.score_complete.checked = false; |
3169 |
06 Mar 15 |
nicklas |
Wizard.setInputStatus('score_total', 'warning', 'Enter 0 in empty fields to complete scoring'); |
3169 |
06 Mar 15 |
nicklas |
572 |
} |
3169 |
06 Mar 15 |
nicklas |
573 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
575 |
{ |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.disabled = true; |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.checked = false; |
3169 |
06 Mar 15 |
nicklas |
Wizard.setInputStatus('score_total', 'warning', 'Not 100%'); |
2832 |
20 Oct 14 |
nicklas |
579 |
} |
3169 |
06 Mar 15 |
nicklas |
580 |
|
3169 |
06 Mar 15 |
nicklas |
// Good stain |
3169 |
06 Mar 15 |
nicklas |
if (sample.GoodStain) |
3169 |
06 Mar 15 |
nicklas |
583 |
{ |
3169 |
06 Mar 15 |
nicklas |
frm.good_stain.checked = true; |
3169 |
06 Mar 15 |
nicklas |
585 |
} |
3169 |
06 Mar 15 |
nicklas |
else |
3169 |
06 Mar 15 |
nicklas |
587 |
{ |
3169 |
06 Mar 15 |
nicklas |
frm.good_stain.checked = false; |
3169 |
06 Mar 15 |
nicklas |
589 |
} |
3169 |
06 Mar 15 |
nicklas |
frm.score_invasive_cancer.focus(); |
2832 |
20 Oct 14 |
nicklas |
591 |
} |
3368 |
08 Jun 15 |
nicklas |
592 |
|
3368 |
08 Jun 15 |
nicklas |
// Image |
3369 |
08 Jun 15 |
nicklas |
Doc.element('he-image-name').innerHTML = Strings.encodeTags(sample.name); |
3368 |
08 Jun 15 |
nicklas |
Doc.hide('file-error'); |
3368 |
08 Jun 15 |
nicklas |
if (sample.image) |
3368 |
08 Jun 15 |
nicklas |
597 |
{ |
3368 |
08 Jun 15 |
nicklas |
Doc.element('he-image').src = App.getRoot() + 'filemanager/files/view/-'+App.getSessionId()+'-' + sample.image; |
6055 |
13 Nov 20 |
nicklas |
Data.set('he-image', 'file-id', 0); |
3369 |
08 Jun 15 |
nicklas |
Doc.addClass('he-image-container', 'has-image'); |
6055 |
13 Nov 20 |
nicklas |
Doc.addClass('he-image-container', 'can-delete'); |
3368 |
08 Jun 15 |
nicklas |
602 |
} |
3368 |
08 Jun 15 |
nicklas |
else |
3368 |
08 Jun 15 |
nicklas |
604 |
{ |
3369 |
08 Jun 15 |
nicklas |
Doc.removeClass('he-image-container', 'has-image'); |
3368 |
08 Jun 15 |
nicklas |
606 |
} |
2832 |
20 Oct 14 |
nicklas |
607 |
|
2832 |
20 Oct 14 |
nicklas |
// Comments |
2832 |
20 Oct 14 |
nicklas |
frm.comments.value = sample.comments || ''; |
2832 |
20 Oct 14 |
nicklas |
610 |
|
2832 |
20 Oct 14 |
nicklas |
// Class name of selected table cell |
2832 |
20 Oct 14 |
nicklas |
if (selectedSample != null) |
2832 |
20 Oct 14 |
nicklas |
613 |
{ |
3282 |
29 Apr 15 |
nicklas |
Doc.removeClass(selectedSample.heGlassId+'-'+selectedSample.well.location, 'selected'); |
2832 |
20 Oct 14 |
nicklas |
615 |
} |
2832 |
20 Oct 14 |
nicklas |
616 |
|
2832 |
20 Oct 14 |
nicklas |
selectedSample = sample; |
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(sample); |
2832 |
20 Oct 14 |
nicklas |
619 |
|
2832 |
20 Oct 14 |
nicklas |
620 |
} |
2832 |
20 Oct 14 |
nicklas |
621 |
|
2832 |
20 Oct 14 |
nicklas |
histology.checkScores = function() |
2832 |
20 Oct 14 |
nicklas |
623 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
625 |
|
2832 |
20 Oct 14 |
nicklas |
for (var i = 0; i < SCORES.length; i++) |
2832 |
20 Oct 14 |
nicklas |
627 |
{ |
2832 |
20 Oct 14 |
nicklas |
selectedSample[SCORES[i]] = histology.toScore(frm[FIELDS[i]].value); |
2832 |
20 Oct 14 |
nicklas |
629 |
} |
2832 |
20 Oct 14 |
nicklas |
630 |
|
2832 |
20 Oct 14 |
nicklas |
var oldTotal = selectedSample.ScoreTotal; |
2832 |
20 Oct 14 |
nicklas |
var oldNumNull = selectedSample.numNullScores; |
2832 |
20 Oct 14 |
nicklas |
633 |
|
2832 |
20 Oct 14 |
nicklas |
var total = histology.calculateTotalScore(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
635 |
|
2832 |
20 Oct 14 |
nicklas |
Doc.element('score_total').innerHTML = total; |
2832 |
20 Oct 14 |
nicklas |
Doc.element(selectedSample.id+'.progress').innerHTML = total + '%'; |
2832 |
20 Oct 14 |
nicklas |
638 |
|
2832 |
20 Oct 14 |
nicklas |
if (total == 100) |
2832 |
20 Oct 14 |
nicklas |
640 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (selectedSample.numNullScores == 0) |
2832 |
20 Oct 14 |
nicklas |
642 |
{ |
2832 |
20 Oct 14 |
nicklas |
// All scores have been entered |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.disabled = false; |
2832 |
20 Oct 14 |
nicklas |
if (oldTotal != total || oldNumNull != selectedSample.numNullScores) |
2832 |
20 Oct 14 |
nicklas |
646 |
{ |
2832 |
20 Oct 14 |
nicklas |
// Only check the 'Score complete' if value has changed |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.checked = true; |
2832 |
20 Oct 14 |
nicklas |
selectedSample.ScoreComplete = true; |
2832 |
20 Oct 14 |
nicklas |
650 |
} |
2832 |
20 Oct 14 |
nicklas |
Wizard.setInputStatus('score_total', 'valid'); |
2832 |
20 Oct 14 |
nicklas |
652 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
654 |
{ |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.disabled = true; |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.checked = false; |
2832 |
20 Oct 14 |
nicklas |
selectedSample.ScoreComplete = false; |
2832 |
20 Oct 14 |
nicklas |
Wizard.setInputStatus('score_total', 'warning', 'Enter 0 in empty fields to complete scoring'); |
2832 |
20 Oct 14 |
nicklas |
659 |
} |
2832 |
20 Oct 14 |
nicklas |
660 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
662 |
{ |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.disabled = true; |
2832 |
20 Oct 14 |
nicklas |
frm.score_complete.checked = false; |
2832 |
20 Oct 14 |
nicklas |
665 |
|
2832 |
20 Oct 14 |
nicklas |
Wizard.setInputStatus('score_total', 'warning', 'Not 100%'); |
2832 |
20 Oct 14 |
nicklas |
selectedSample.ScoreComplete = selectedSample.ScoreTotal == null ? null : false; |
2832 |
20 Oct 14 |
nicklas |
668 |
} |
2832 |
20 Oct 14 |
nicklas |
669 |
|
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
histology.saveToLocalStorage(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
672 |
} |
2832 |
20 Oct 14 |
nicklas |
673 |
|
2832 |
20 Oct 14 |
nicklas |
histology.toScore = function(value) |
2832 |
20 Oct 14 |
nicklas |
675 |
{ |
2832 |
20 Oct 14 |
nicklas |
var score = parseInt(value); |
2832 |
20 Oct 14 |
nicklas |
return isNaN(score) ? null : score; |
2832 |
20 Oct 14 |
nicklas |
678 |
} |
2832 |
20 Oct 14 |
nicklas |
679 |
|
2832 |
20 Oct 14 |
nicklas |
histology.goodStainOnClick = function() |
2832 |
20 Oct 14 |
nicklas |
681 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
683 |
|
2832 |
20 Oct 14 |
nicklas |
var goodSample = histology.getGoodStainedSampleForLocation(selectedSample.well.location); |
2832 |
20 Oct 14 |
nicklas |
if (goodSample != null && goodSample != selectedSample) |
2832 |
20 Oct 14 |
nicklas |
686 |
{ |
2832 |
20 Oct 14 |
nicklas |
// Reset the current GoodStain sample |
2832 |
20 Oct 14 |
nicklas |
goodSample.GoodStain = null; |
2832 |
20 Oct 14 |
nicklas |
histology.saveToLocalStorage(goodSample); |
2832 |
20 Oct 14 |
nicklas |
690 |
} |
2832 |
20 Oct 14 |
nicklas |
691 |
|
2832 |
20 Oct 14 |
nicklas |
selectedSample.GoodStain = frm.good_stain.checked ? true : null; |
2832 |
20 Oct 14 |
nicklas |
histology.saveToLocalStorage(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
694 |
|
2832 |
20 Oct 14 |
nicklas |
// Repaint samples on current location |
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < heGlass.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
697 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = heGlass[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
699 |
|
2832 |
20 Oct 14 |
nicklas |
for (var sampleNo = 0; sampleNo < glass.samples.length; sampleNo++) |
2832 |
20 Oct 14 |
nicklas |
701 |
{ |
2832 |
20 Oct 14 |
nicklas |
var sample = glass.samples[sampleNo]; |
2832 |
20 Oct 14 |
nicklas |
if (sample.well.location == selectedSample.well.location) |
2832 |
20 Oct 14 |
nicklas |
704 |
{ |
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(sample); |
2832 |
20 Oct 14 |
nicklas |
706 |
} |
2832 |
20 Oct 14 |
nicklas |
707 |
} |
2832 |
20 Oct 14 |
nicklas |
708 |
} |
2832 |
20 Oct 14 |
nicklas |
709 |
} |
2832 |
20 Oct 14 |
nicklas |
710 |
|
2832 |
20 Oct 14 |
nicklas |
histology.scoreCompleteOnClick = function() |
2832 |
20 Oct 14 |
nicklas |
712 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
selectedSample.ScoreComplete = frm.score_complete.checked; |
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
histology.saveToLocalStorage(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
717 |
} |
2832 |
20 Oct 14 |
nicklas |
718 |
|
2832 |
20 Oct 14 |
nicklas |
histology.commentsOnChange = function() |
2832 |
20 Oct 14 |
nicklas |
720 |
{ |
2832 |
20 Oct 14 |
nicklas |
var frm = document.forms['reggie']; |
2832 |
20 Oct 14 |
nicklas |
selectedSample.comments = frm.comments.value; |
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
histology.saveToLocalStorage(selectedSample); |
2832 |
20 Oct 14 |
nicklas |
725 |
} |
3169 |
06 Mar 15 |
nicklas |
726 |
|
3169 |
06 Mar 15 |
nicklas |
histology.ihcQualityOnChange = function() |
3169 |
06 Mar 15 |
nicklas |
728 |
{ |
3169 |
06 Mar 15 |
nicklas |
var frm = document.forms['reggie']; |
3169 |
06 Mar 15 |
nicklas |
selectedSample.IHCQuality = frm.ihc_quality.value || null; |
3169 |
06 Mar 15 |
nicklas |
Doc.element(selectedSample.id+'.progress').innerHTML = Strings.encodeTags(selectedSample.IHC + ': ' + (selectedSample.IHCQuality || '?')); |
3169 |
06 Mar 15 |
nicklas |
histology.setSampleClassName(selectedSample); |
3169 |
06 Mar 15 |
nicklas |
histology.saveToLocalStorage(selectedSample); |
3169 |
06 Mar 15 |
nicklas |
734 |
} |
2832 |
20 Oct 14 |
nicklas |
735 |
|
3367 |
05 Jun 15 |
nicklas |
// Open a popup with the full image |
3367 |
05 Jun 15 |
nicklas |
histology.imageOnClick = function() |
3367 |
05 Jun 15 |
nicklas |
738 |
{ |
3367 |
05 Jun 15 |
nicklas |
var img = Doc.element('he-image'); |
6055 |
13 Nov 20 |
nicklas |
var fileId = Data.int(img, 'file-id', 0); |
6055 |
13 Nov 20 |
nicklas |
if (fileId && fileId > 0) |
3368 |
08 Jun 15 |
nicklas |
742 |
{ |
6055 |
13 Nov 20 |
nicklas |
Files.viewFile(fileId); |
6055 |
13 Nov 20 |
nicklas |
744 |
} |
6055 |
13 Nov 20 |
nicklas |
else if (img.src) |
6055 |
13 Nov 20 |
nicklas |
746 |
{ |
3369 |
08 Jun 15 |
nicklas |
var options = 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes'; |
3369 |
08 Jun 15 |
nicklas |
if (img.naturalHeight && img.naturalWidth) |
3369 |
08 Jun 15 |
nicklas |
749 |
{ |
3369 |
08 Jun 15 |
nicklas |
options += ',width='+(img.naturalWidth+20)+',height='+(img.naturalHeight+20); |
3369 |
08 Jun 15 |
nicklas |
751 |
} |
6055 |
13 Nov 20 |
nicklas |
window.open(img.fullSrc || img.src, 'Image'+selectedSample.name, options); |
3368 |
08 Jun 15 |
nicklas |
753 |
} |
3367 |
05 Jun 15 |
nicklas |
754 |
} |
3367 |
05 Jun 15 |
nicklas |
755 |
|
3369 |
08 Jun 15 |
nicklas |
histology.selectFile = function() |
3369 |
08 Jun 15 |
nicklas |
757 |
{ |
3369 |
08 Jun 15 |
nicklas |
Doc.element('selectFile').click(); |
3369 |
08 Jun 15 |
nicklas |
759 |
} |
3369 |
08 Jun 15 |
nicklas |
760 |
|
3369 |
08 Jun 15 |
nicklas |
histology.fileSelected = function() |
3369 |
08 Jun 15 |
nicklas |
762 |
{ |
3369 |
08 Jun 15 |
nicklas |
var files = Doc.element('selectFile').files; |
3369 |
08 Jun 15 |
nicklas |
if (files.length > 0) |
3369 |
08 Jun 15 |
nicklas |
765 |
{ |
3369 |
08 Jun 15 |
nicklas |
// The file to upload |
3369 |
08 Jun 15 |
nicklas |
histology.uploadFile(files[0]); |
3369 |
08 Jun 15 |
nicklas |
768 |
} |
3369 |
08 Jun 15 |
nicklas |
769 |
} |
3369 |
08 Jun 15 |
nicklas |
770 |
|
3367 |
05 Jun 15 |
nicklas |
// Visual feedback when drop target zone is entered |
6824 |
30 Aug 22 |
nicklas |
histology.onDragEnter = function() |
3367 |
05 Jun 15 |
nicklas |
773 |
{ |
3367 |
05 Jun 15 |
nicklas |
Doc.addClass('he-image-container', 'dragging'); |
3367 |
05 Jun 15 |
nicklas |
Doc.hide('file-error'); |
3367 |
05 Jun 15 |
nicklas |
776 |
} |
3367 |
05 Jun 15 |
nicklas |
777 |
|
3367 |
05 Jun 15 |
nicklas |
// Visual feedback when leaving drop target zone |
6824 |
30 Aug 22 |
nicklas |
histology.onDragLeave = function() |
3367 |
05 Jun 15 |
nicklas |
780 |
{ |
3367 |
05 Jun 15 |
nicklas |
Doc.removeClass('he-image-container', 'dragging'); |
3367 |
05 Jun 15 |
nicklas |
782 |
} |
3367 |
05 Jun 15 |
nicklas |
783 |
|
3367 |
05 Jun 15 |
nicklas |
// Need to prevent default event to stop browser from loading the dropped file |
3367 |
05 Jun 15 |
nicklas |
histology.onDragOver = function(event) |
3367 |
05 Jun 15 |
nicklas |
786 |
{ |
3367 |
05 Jun 15 |
nicklas |
event.preventDefault(); |
3367 |
05 Jun 15 |
nicklas |
788 |
} |
3367 |
05 Jun 15 |
nicklas |
789 |
|
3367 |
05 Jun 15 |
nicklas |
// A file has been dropped |
3367 |
05 Jun 15 |
nicklas |
histology.onDropFile = function(event) |
3367 |
05 Jun 15 |
nicklas |
792 |
{ |
3367 |
05 Jun 15 |
nicklas |
event.preventDefault(); |
3367 |
05 Jun 15 |
nicklas |
Doc.removeClass('he-image-container', 'dragging'); |
3367 |
05 Jun 15 |
nicklas |
var files = event.dataTransfer.files; |
3367 |
05 Jun 15 |
nicklas |
if (files.length > 0) |
3367 |
05 Jun 15 |
nicklas |
797 |
{ |
3368 |
08 Jun 15 |
nicklas |
// The file to upload |
3369 |
08 Jun 15 |
nicklas |
histology.uploadFile(files[0]); |
3367 |
05 Jun 15 |
nicklas |
800 |
} |
3367 |
05 Jun 15 |
nicklas |
801 |
} |
3367 |
05 Jun 15 |
nicklas |
802 |
|
6016 |
09 Oct 20 |
nicklas |
// Check if paste event contains an image |
6016 |
09 Oct 20 |
nicklas |
histology.pasteImage = function(event) |
6016 |
09 Oct 20 |
nicklas |
805 |
{ |
6016 |
09 Oct 20 |
nicklas |
var clipboardItems = event.clipboardData.items; |
6016 |
09 Oct 20 |
nicklas |
if (!clipboardItems) return; |
6016 |
09 Oct 20 |
nicklas |
808 |
|
6016 |
09 Oct 20 |
nicklas |
for (var i = 0; i < clipboardItems.length; i++) |
6016 |
09 Oct 20 |
nicklas |
810 |
{ |
6016 |
09 Oct 20 |
nicklas |
var item = clipboardItems[i]; |
6016 |
09 Oct 20 |
nicklas |
if (item.type == 'image/png' || item.type == 'image/jpg' || item.type == 'image/tiff') |
6016 |
09 Oct 20 |
nicklas |
813 |
{ |
6016 |
09 Oct 20 |
nicklas |
var file = item.getAsFile(); |
6016 |
09 Oct 20 |
nicklas |
if (file) histology.uploadFile(file); |
6016 |
09 Oct 20 |
nicklas |
event.preventDefault(); |
6016 |
09 Oct 20 |
nicklas |
return; |
6016 |
09 Oct 20 |
nicklas |
818 |
} |
6016 |
09 Oct 20 |
nicklas |
819 |
} |
6016 |
09 Oct 20 |
nicklas |
820 |
} |
6016 |
09 Oct 20 |
nicklas |
821 |
|
3369 |
08 Jun 15 |
nicklas |
histology.uploadFile = function(file) |
3369 |
08 Jun 15 |
nicklas |
823 |
{ |
3369 |
08 Jun 15 |
nicklas |
if (selectedSample.image) |
3369 |
08 Jun 15 |
nicklas |
825 |
{ |
3369 |
08 Jun 15 |
nicklas |
if (!confirm('Replace the current image with \'' + file.name + '\'?')) return; |
3369 |
08 Jun 15 |
nicklas |
827 |
} |
3369 |
08 Jun 15 |
nicklas |
828 |
|
3372 |
09 Jun 15 |
nicklas |
if (file.type != 'image/png' && file.type != 'image/jpeg' && file.type != 'image/tiff') |
3369 |
08 Jun 15 |
nicklas |
830 |
{ |
3372 |
09 Jun 15 |
nicklas |
histology.showFileUploadError('The file must be a TIF, JPG or PNG file: ' + file.type); |
3369 |
08 Jun 15 |
nicklas |
return; |
3369 |
08 Jun 15 |
nicklas |
833 |
} |
3369 |
08 Jun 15 |
nicklas |
834 |
|
3372 |
09 Jun 15 |
nicklas |
Doc.removeClass('he-image-container', 'has-image'); |
3372 |
09 Jun 15 |
nicklas |
Doc.addClass('he-image-container', 'uploading'); |
3372 |
09 Jun 15 |
nicklas |
837 |
|
3369 |
08 Jun 15 |
nicklas |
var url = '../Histology.servlet?ID='+App.getSessionId(); |
3369 |
08 Jun 15 |
nicklas |
url += '&cmd=UploadImage'; |
3369 |
08 Jun 15 |
nicklas |
url += '&sampleId='+selectedSample.id; |
3369 |
08 Jun 15 |
nicklas |
url += '&filename='+encodeURIComponent(file.name); |
3369 |
08 Jun 15 |
nicklas |
842 |
|
3369 |
08 Jun 15 |
nicklas |
var upload = Ajax.getXmlHttpRequest(); |
3369 |
08 Jun 15 |
nicklas |
upload.open('POST', url, true); |
3369 |
08 Jun 15 |
nicklas |
Ajax.setReadyStateHandler(upload, histology.fileLoaded, histology.fileLoaded); |
3372 |
09 Jun 15 |
nicklas |
upload.send(file); |
3369 |
08 Jun 15 |
nicklas |
847 |
} |
3369 |
08 Jun 15 |
nicklas |
848 |
|
3367 |
05 Jun 15 |
nicklas |
histology.showFileUploadError = function(msg) |
3367 |
05 Jun 15 |
nicklas |
850 |
{ |
3367 |
05 Jun 15 |
nicklas |
var errorDiv = Doc.element('file-error'); |
3367 |
05 Jun 15 |
nicklas |
errorDiv.innerHTML = msg; |
3367 |
05 Jun 15 |
nicklas |
Doc.show(errorDiv); |
3367 |
05 Jun 15 |
nicklas |
854 |
} |
3367 |
05 Jun 15 |
nicklas |
855 |
|
3367 |
05 Jun 15 |
nicklas |
// Display the loaded file in the preview section |
3368 |
08 Jun 15 |
nicklas |
histology.fileLoaded = function(request) |
3367 |
05 Jun 15 |
nicklas |
858 |
{ |
3372 |
09 Jun 15 |
nicklas |
Doc.removeClass('he-image-container', 'uploading'); |
3368 |
08 Jun 15 |
nicklas |
response = JSON.parse(request.responseText); |
3368 |
08 Jun 15 |
nicklas |
if (response.status != 'ok') |
3368 |
08 Jun 15 |
nicklas |
862 |
{ |
3368 |
08 Jun 15 |
nicklas |
histology.showFileUploadError(response.message || response.stacktrace); |
3368 |
08 Jun 15 |
nicklas |
return; |
3368 |
08 Jun 15 |
nicklas |
865 |
} |
3368 |
08 Jun 15 |
nicklas |
866 |
|
3368 |
08 Jun 15 |
nicklas |
selectedSample.image = response.image+'?'+(new Date().getTime()); // To avoid problems with caching the old image |
3368 |
08 Jun 15 |
nicklas |
Doc.element('he-image').src = App.getRoot() + 'filemanager/files/view/-'+App.getSessionId()+'-' + selectedSample.image; |
6055 |
13 Nov 20 |
nicklas |
Data.set('he-image', 'file-id', 0); |
3369 |
08 Jun 15 |
nicklas |
Doc.addClass('he-image-container', 'has-image'); |
6055 |
13 Nov 20 |
nicklas |
Doc.addClass('he-image-container', 'can-delete'); |
3368 |
08 Jun 15 |
nicklas |
Doc.hide('file-error'); |
3368 |
08 Jun 15 |
nicklas |
histology.setSampleClassName(selectedSample); |
3367 |
05 Jun 15 |
nicklas |
874 |
} |
3367 |
05 Jun 15 |
nicklas |
875 |
|
3369 |
08 Jun 15 |
nicklas |
histology.deleteImage = function() |
3369 |
08 Jun 15 |
nicklas |
877 |
{ |
3369 |
08 Jun 15 |
nicklas |
if (!confirm('Delete this image?')) return; |
3369 |
08 Jun 15 |
nicklas |
879 |
|
3369 |
08 Jun 15 |
nicklas |
var url = '../Histology.servlet?ID='+App.getSessionId(); |
3369 |
08 Jun 15 |
nicklas |
url += '&cmd=DeleteImage'; |
3369 |
08 Jun 15 |
nicklas |
url += '&sampleId='+selectedSample.id; |
3369 |
08 Jun 15 |
nicklas |
883 |
|
3369 |
08 Jun 15 |
nicklas |
var req = Ajax.getXmlHttpRequest(); |
3369 |
08 Jun 15 |
nicklas |
req.open('POST', url, true); |
3369 |
08 Jun 15 |
nicklas |
Ajax.setReadyStateHandler(req, histology.fileDeleted, histology.fileDeleted); |
3369 |
08 Jun 15 |
nicklas |
req.send(); |
3369 |
08 Jun 15 |
nicklas |
888 |
} |
3369 |
08 Jun 15 |
nicklas |
889 |
|
3369 |
08 Jun 15 |
nicklas |
histology.fileDeleted = function(request) |
3369 |
08 Jun 15 |
nicklas |
891 |
{ |
3369 |
08 Jun 15 |
nicklas |
response = JSON.parse(request.responseText); |
3369 |
08 Jun 15 |
nicklas |
if (response.status != 'ok') |
3369 |
08 Jun 15 |
nicklas |
894 |
{ |
3369 |
08 Jun 15 |
nicklas |
histology.showFileUploadError(response.message || response.stacktrace); |
3369 |
08 Jun 15 |
nicklas |
return; |
3369 |
08 Jun 15 |
nicklas |
897 |
} |
3369 |
08 Jun 15 |
nicklas |
898 |
|
3369 |
08 Jun 15 |
nicklas |
selectedSample.image = null; |
3369 |
08 Jun 15 |
nicklas |
Doc.removeClass('he-image-container', 'has-image'); |
3369 |
08 Jun 15 |
nicklas |
Doc.hide('file-error'); |
3369 |
08 Jun 15 |
nicklas |
histology.setSampleClassName(selectedSample); |
3369 |
08 Jun 15 |
nicklas |
903 |
} |
3369 |
08 Jun 15 |
nicklas |
904 |
|
2832 |
20 Oct 14 |
nicklas |
histology.submit = function() |
2832 |
20 Oct 14 |
nicklas |
906 |
{ |
2832 |
20 Oct 14 |
nicklas |
samples = []; |
2832 |
20 Oct 14 |
nicklas |
var glassInfo = []; |
2832 |
20 Oct 14 |
nicklas |
909 |
|
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < heGlass.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
911 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = heGlass[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
var scoreCompleteForGlass = true; |
2832 |
20 Oct 14 |
nicklas |
for (var sampleNo = 0; sampleNo < glass.samples.length; sampleNo++) |
2832 |
20 Oct 14 |
nicklas |
915 |
{ |
2832 |
20 Oct 14 |
nicklas |
var sample = glass.samples[sampleNo]; |
2832 |
20 Oct 14 |
nicklas |
if (histology.isModified(sample)) |
2832 |
20 Oct 14 |
nicklas |
918 |
{ |
2832 |
20 Oct 14 |
nicklas |
samples[samples.length] = sample; |
2832 |
20 Oct 14 |
nicklas |
920 |
} |
2832 |
20 Oct 14 |
nicklas |
921 |
|
3169 |
06 Mar 15 |
nicklas |
if (glass.IHC) |
2832 |
20 Oct 14 |
nicklas |
923 |
{ |
3169 |
06 Mar 15 |
nicklas |
if (!sample.IHCQuality) scoreCompleteForGlass = false; |
2832 |
20 Oct 14 |
nicklas |
925 |
} |
3169 |
06 Mar 15 |
nicklas |
else |
3169 |
06 Mar 15 |
nicklas |
927 |
{ |
3169 |
06 Mar 15 |
nicklas |
if (sample.GoodStain && sample.ScoreComplete != true || sample.ScoreComplete == false) |
3169 |
06 Mar 15 |
nicklas |
929 |
{ |
3169 |
06 Mar 15 |
nicklas |
scoreCompleteForGlass = false; |
3169 |
06 Mar 15 |
nicklas |
931 |
} |
3169 |
06 Mar 15 |
nicklas |
932 |
} |
2832 |
20 Oct 14 |
nicklas |
933 |
} |
2832 |
20 Oct 14 |
nicklas |
934 |
|
2832 |
20 Oct 14 |
nicklas |
var tmp = {}; |
2832 |
20 Oct 14 |
nicklas |
tmp.id = glass.id; |
2832 |
20 Oct 14 |
nicklas |
tmp.ScoreComplete = scoreCompleteForGlass; |
2832 |
20 Oct 14 |
nicklas |
glassInfo[glassInfo.length] = tmp; |
2832 |
20 Oct 14 |
nicklas |
939 |
} |
2832 |
20 Oct 14 |
nicklas |
940 |
|
2832 |
20 Oct 14 |
nicklas |
if (samples.length == 0) |
2832 |
20 Oct 14 |
nicklas |
942 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (!confirm('Nothing has changed! Continue saving?')) |
2832 |
20 Oct 14 |
nicklas |
944 |
{ |
2832 |
20 Oct 14 |
nicklas |
return; |
2832 |
20 Oct 14 |
nicklas |
946 |
} |
2832 |
20 Oct 14 |
nicklas |
947 |
} |
2832 |
20 Oct 14 |
nicklas |
948 |
|
2832 |
20 Oct 14 |
nicklas |
Doc.hide('score-container'); |
2832 |
20 Oct 14 |
nicklas |
Doc.addClass('he-glass-container', 'disabled'); |
2832 |
20 Oct 14 |
nicklas |
951 |
|
2832 |
20 Oct 14 |
nicklas |
var submitInfo = {}; |
2832 |
20 Oct 14 |
nicklas |
submitInfo.samples = samples; |
2832 |
20 Oct 14 |
nicklas |
submitInfo.heGlass = glassInfo; |
2832 |
20 Oct 14 |
nicklas |
955 |
|
2832 |
20 Oct 14 |
nicklas |
var url = '../Histology.servlet?ID='+App.getSessionId(); |
2832 |
20 Oct 14 |
nicklas |
url += '&cmd=SaveHeScore'; |
2832 |
20 Oct 14 |
nicklas |
Wizard.showLoadingAnimation('Saving...'); |
2832 |
20 Oct 14 |
nicklas |
Wizard.asyncJsonRequest(url, histology.submissionResults, 'POST', JSON.stringify(submitInfo)); |
2832 |
20 Oct 14 |
nicklas |
960 |
} |
2832 |
20 Oct 14 |
nicklas |
961 |
|
2832 |
20 Oct 14 |
nicklas |
histology.submissionResults = function(response) |
2832 |
20 Oct 14 |
nicklas |
963 |
{ |
2832 |
20 Oct 14 |
nicklas |
// Reset changed properties and remove saved info |
2832 |
20 Oct 14 |
nicklas |
for (var sampleNo = 0; sampleNo < samples.length; sampleNo++) |
2832 |
20 Oct 14 |
nicklas |
966 |
{ |
2832 |
20 Oct 14 |
nicklas |
var sample = samples[sampleNo]; |
2832 |
20 Oct 14 |
nicklas |
histology.saveOriginalProperties(sample); |
2832 |
20 Oct 14 |
nicklas |
histology.setSampleClassName(sample); |
2832 |
20 Oct 14 |
nicklas |
histology.removeFromLocalStorage(sample); |
2832 |
20 Oct 14 |
nicklas |
971 |
} |
2832 |
20 Oct 14 |
nicklas |
972 |
|
2832 |
20 Oct 14 |
nicklas |
disableModificationCheck = true; |
2832 |
20 Oct 14 |
nicklas |
Wizard.showFinalMessage(response.messages); |
2832 |
20 Oct 14 |
nicklas |
Doc.show('gonext'); |
2832 |
20 Oct 14 |
nicklas |
976 |
} |
2832 |
20 Oct 14 |
nicklas |
977 |
|
2832 |
20 Oct 14 |
nicklas |
978 |
|
2832 |
20 Oct 14 |
nicklas |
979 |
/** |
2832 |
20 Oct 14 |
nicklas |
Confirm if leaving the page is ok. If no event is passed this method |
2832 |
20 Oct 14 |
nicklas |
is called manually and need to display dialog, otherwise the browser |
2832 |
20 Oct 14 |
nicklas |
is taking care of this automatically. |
2832 |
20 Oct 14 |
nicklas |
983 |
*/ |
2832 |
20 Oct 14 |
nicklas |
histology.confirmLeaveWizard = function(event) |
2832 |
20 Oct 14 |
nicklas |
985 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (disableModificationCheck) return; |
2832 |
20 Oct 14 |
nicklas |
987 |
|
2832 |
20 Oct 14 |
nicklas |
var numModified = 0; |
2832 |
20 Oct 14 |
nicklas |
for (var glassNo = 0; glassNo < heGlass.length; glassNo++) |
2832 |
20 Oct 14 |
nicklas |
990 |
{ |
2832 |
20 Oct 14 |
nicklas |
var glass = heGlass[glassNo]; |
2832 |
20 Oct 14 |
nicklas |
for (var sampleNo = 0; sampleNo < glass.samples.length; sampleNo++) |
2832 |
20 Oct 14 |
nicklas |
993 |
{ |
2832 |
20 Oct 14 |
nicklas |
var sample = glass.samples[sampleNo]; |
2832 |
20 Oct 14 |
nicklas |
if (histology.isModified(sample)) |
2832 |
20 Oct 14 |
nicklas |
996 |
{ |
2832 |
20 Oct 14 |
nicklas |
numModified++; |
2832 |
20 Oct 14 |
nicklas |
998 |
} |
2832 |
20 Oct 14 |
nicklas |
999 |
} |
2832 |
20 Oct 14 |
nicklas |
1000 |
} |
2832 |
20 Oct 14 |
nicklas |
1001 |
|
2832 |
20 Oct 14 |
nicklas |
if (event) |
2832 |
20 Oct 14 |
nicklas |
1003 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (numModified > 0) event.preventDefault(); |
2832 |
20 Oct 14 |
nicklas |
1005 |
} |
2832 |
20 Oct 14 |
nicklas |
else |
2832 |
20 Oct 14 |
nicklas |
1007 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (numModified > 0) |
2832 |
20 Oct 14 |
nicklas |
1009 |
{ |
2832 |
20 Oct 14 |
nicklas |
return confirm('There are unsaved modifications. Continue?'); |
2832 |
20 Oct 14 |
nicklas |
1011 |
} |
2832 |
20 Oct 14 |
nicklas |
return true; |
2832 |
20 Oct 14 |
nicklas |
1013 |
} |
2832 |
20 Oct 14 |
nicklas |
1014 |
} |
2832 |
20 Oct 14 |
nicklas |
1015 |
|
2832 |
20 Oct 14 |
nicklas |
1016 |
|
2832 |
20 Oct 14 |
nicklas |
1017 |
/** |
2832 |
20 Oct 14 |
nicklas |
Save score information to the local storage. |
2832 |
20 Oct 14 |
nicklas |
1019 |
*/ |
2832 |
20 Oct 14 |
nicklas |
histology.saveToLocalStorage = function(sample) |
2832 |
20 Oct 14 |
nicklas |
1021 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (histology.isModified(sample, true)) |
2832 |
20 Oct 14 |
nicklas |
1023 |
{ |
2832 |
20 Oct 14 |
nicklas |
var storeKey = histology.getStoreKey(sample); |
2832 |
20 Oct 14 |
nicklas |
App.setLocal(storeKey, JSON.stringify(sample)); |
2832 |
20 Oct 14 |
nicklas |
if (debug) |
2832 |
20 Oct 14 |
nicklas |
1027 |
{ |
2832 |
20 Oct 14 |
nicklas |
App.debug('saveToLocalStorage: ' + sample.name + '=' + App.getLocal(storeKey)); |
2832 |
20 Oct 14 |
nicklas |
1029 |
} |
2832 |
20 Oct 14 |
nicklas |
1030 |
} |
2832 |
20 Oct 14 |
nicklas |
1031 |
} |
2832 |
20 Oct 14 |
nicklas |
1032 |
|
2832 |
20 Oct 14 |
nicklas |
histology.removeFromLocalStorage = function(sample) |
2832 |
20 Oct 14 |
nicklas |
1034 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (debug) App.debug('removeFromLocalStorage:' + sample.name); |
2832 |
20 Oct 14 |
nicklas |
App.removeLocal(histology.getStoreKey(sample)); |
2832 |
20 Oct 14 |
nicklas |
1037 |
} |
2832 |
20 Oct 14 |
nicklas |
1038 |
|
2832 |
20 Oct 14 |
nicklas |
histology.restoreFromLocalStorage = function(sample) |
2832 |
20 Oct 14 |
nicklas |
1040 |
{ |
2832 |
20 Oct 14 |
nicklas |
try |
2832 |
20 Oct 14 |
nicklas |
1042 |
{ |
2832 |
20 Oct 14 |
nicklas |
var storeKey = histology.getStoreKey(sample); |
2832 |
20 Oct 14 |
nicklas |
var stored = App.getLocal(storeKey); |
2832 |
20 Oct 14 |
nicklas |
if (debug) App.debug(stored); |
2832 |
20 Oct 14 |
nicklas |
if (!stored) return; |
2832 |
20 Oct 14 |
nicklas |
1047 |
|
2832 |
20 Oct 14 |
nicklas |
var tmp = JSON.parse(stored); |
2832 |
20 Oct 14 |
nicklas |
if (!tmp) return; |
2832 |
20 Oct 14 |
nicklas |
1050 |
|
2832 |
20 Oct 14 |
nicklas |
// Check that all original scores are the same, or someone has modified |
2832 |
20 Oct 14 |
nicklas |
// this sample from another computer |
2832 |
20 Oct 14 |
nicklas |
for (var p in sample.o) |
2832 |
20 Oct 14 |
nicklas |
1054 |
{ |
2832 |
20 Oct 14 |
nicklas |
if (sample.o[p] != tmp.o[p]) |
2832 |
20 Oct 14 |
nicklas |
1056 |
{ |
2832 |
20 Oct 14 |
nicklas |
return; |
2832 |
20 Oct 14 |
nicklas |
1058 |
} |
2832 |
20 Oct 14 |
nicklas |
1059 |
} |
2832 |
20 Oct 14 |
nicklas |
1060 |
|
2832 |
20 Oct 14 |
nicklas |
// Ok, copy stored info to the current sample |
2832 |
20 Oct 14 |
nicklas |
for (var i = 0; i < SCORES.length; i++) |
2832 |
20 Oct 14 |
nicklas |
1063 |
{ |
2832 |
20 Oct 14 |
nicklas |
sample[SCORES[i]] = tmp[SCORES[i]]; |
2832 |
20 Oct 14 |
nicklas |
1065 |
} |
2832 |
20 Oct 14 |
nicklas |
sample.ScoreComplete = tmp.ScoreComplete; |
2832 |
20 Oct 14 |
nicklas |
sample.GoodStain = tmp.GoodStain; |
2832 |
20 Oct 14 |
nicklas |
sample.comments = tmp.comments; |
3169 |
06 Mar 15 |
nicklas |
sample.IHCQuality = tmp.IHCQuality; |
2832 |
20 Oct 14 |
nicklas |
1070 |
} |
2832 |
20 Oct 14 |
nicklas |
catch (e) |
2832 |
20 Oct 14 |
nicklas |
1072 |
{ |
2832 |
20 Oct 14 |
nicklas |
App.debug('Could not load stored information for sample ' + sample.name + ': ' + e); |
2832 |
20 Oct 14 |
nicklas |
1074 |
} |
2832 |
20 Oct 14 |
nicklas |
1075 |
} |
2832 |
20 Oct 14 |
nicklas |
1076 |
|
2832 |
20 Oct 14 |
nicklas |
histology.getStoreKey = function(sample) |
2832 |
20 Oct 14 |
nicklas |
1078 |
{ |
2832 |
20 Oct 14 |
nicklas |
return 'reggie.histology.' + sample.id + '.scoreInfo'; |
2832 |
20 Oct 14 |
nicklas |
1080 |
} |
2832 |
20 Oct 14 |
nicklas |
1081 |
|
2832 |
20 Oct 14 |
nicklas |
return histology; |
2832 |
20 Oct 14 |
nicklas |
1083 |
}(); |
2832 |
20 Oct 14 |
nicklas |
1084 |
|
2832 |
20 Oct 14 |
nicklas |
Doc.onLoad(Histology.initPage); |
2832 |
20 Oct 14 |
nicklas |
1086 |
|