diff --git a/apps/heatmap/heatmap.html b/apps/heatmap/heatmap.html index 9c2a04bd8..6bed0baa9 100644 --- a/apps/heatmap/heatmap.html +++ b/apps/heatmap/heatmap.html @@ -189,7 +189,7 @@ } else if(!$D.params.execId){ - redirect($D.pages.table,'execId is undefined. Redirecting to Table.'); + redirect($D.pages.table,'ExecId Is Undefined. Redirecting To Table.'); } else if ($D.params && ($D.params.slide || $D.params.specimen ||$D.params.study || $D.params.location)){ @@ -197,7 +197,7 @@ STORE.findSlide($D.params.slide, $D.params.study, $D.params.specimen, $D.params.location).then(x=>{ let offset = parseInt($D.params.offset,10) || 0; if(x.length == 0 || offset >= x.length){ - redirect($D.pages.table,'No Slide Found. Redirecting to Table.'); + redirect($D.pages.table,'No Slide Found. Redirecting To Table.'); } else { newParams = $D.params delete newParams.data @@ -210,13 +210,13 @@ } }).catch(e=>{ console.warn(e) - redirect($D.pages.table,'Redirecting to Table.'); + redirect($D.pages.table,'Redirecting To Table.'); }) // find the associated slideID // open viewer with that slideID } else { - redirect($D.pages.table,'Slide is undefined. Redirecting to Table.'); + redirect($D.pages.table,'Slide Is Undefined. Redirecting To Table.'); } // get states parameters diff --git a/apps/heatmap/init.js b/apps/heatmap/init.js index 9825460e3..a612e4ac2 100644 --- a/apps/heatmap/init.js +++ b/apps/heatmap/init.js @@ -89,7 +89,7 @@ function initCore(){ if(!$D.heatMapData){ - redirect($D.pages.table,`No Heatmap's data Found. Redirecting to Table.`); + redirect($D.pages.table,`No Heatmap's Data Found. Redirecting To Table.`); } @@ -185,7 +185,7 @@ function initCore(){ // editedDate:$D. onFieldChange: editorPenChange, onReset: function(){ - if(confirm('Do you want to clear edited data?')){ + if(confirm('Do You Want To Clear Edited Data?')){ $CAMIC.viewer.canvasDrawInstance.clear(); } }, // clearEditData diff --git a/apps/heatmap/uicallbacks.js b/apps/heatmap/uicallbacks.js index aa9aeaa7c..55b676eae 100644 --- a/apps/heatmap/uicallbacks.js +++ b/apps/heatmap/uicallbacks.js @@ -371,7 +371,7 @@ function heatmapEditorOff(){ 2. Analytics */ async function onUpdateHeatmapFields(){ - if(!confirm('Do you want to update Threshold values?')) return; + if(!confirm('Do You Want To Update Threshold?')) return; Loading.open(document.body,'Saving Threshold ... '); const fields = $D.heatMapData.provenance.analysis.fields; const subject = $D.heatMapData.provenance.image.subject_id; @@ -384,7 +384,7 @@ async function onUpdateHeatmapFields(){ async function onExportEditData(){ if($D.editedDataClusters.isEmpty()){ - alert('There are no edit data to export...'); + alert('No Edit Data ... '); return; } const user = getUserId(); @@ -548,8 +548,8 @@ async function onDeleteEditData(data){ const cluster = data.cluster; const idx = data.index; - if(!confirm(`Do you want to delete { ${cluster.name} - ${cluster.value==0?'Negative':'Positive'} index:${idx} }?`)) return; - Loading.open(document.body,`deleting Edit Data ...`); + if(!confirm(`Do You Want To Delete { ${cluster.name} - ${cluster.value==0?'Negative':'Positive'} Index:${idx} }?`)) return; + Loading.open(document.body,`Deleting Edit Data ...`); // UPDATE EDIT DATA $D.editedDataClusters.removeEditDataForCluster(cluster.index, cluster.name, cluster.value, cluster.color, idx); diff --git a/apps/labeling/labeling.html b/apps/labeling/labeling.html index a03997c0c..273a458ee 100644 --- a/apps/labeling/labeling.html +++ b/apps/labeling/labeling.html @@ -91,7 +91,7 @@ createWarningText('You are using an IE/Edge browser that may be lead to erratic behavior on caMicroscope. Please switch to Chrome, Firefox or Safari browser to improve your experience.'); } - Loading.open(document.body, 'CaMicroscope is initializing...'); + Loading.open(document.body, 'CaMicroscope Is Initializing...'); // get slide id from url const url = new URL(window.location.href); $D.params = getUrlVars(); @@ -105,7 +105,7 @@ STORE.findSlide($D.params.slide, $D.params.study, $D.params.specimen, $D.params.location).then(x=>{ let offset = parseInt($D.params.offset,10) || 0; if(x.length == 0 || offset >= x.length){ - redirect($D.pages.table,'No Slide Found. Redirecting to Table.'); + redirect($D.pages.table,'No Slide Found. Redirecting To Table.'); } else { newParams = $D.params delete newParams.data @@ -118,12 +118,12 @@ } }).catch(e=>{ console.warn(e) - redirect($D.pages.table,'Redirecting to Table.'); + redirect($D.pages.table,'Redirecting To Table.'); }) // find the associated slideID // open viewer with that slideID }else{ - redirect($D.pages.table,'Slide Id is undefined. Redirecting to Flex Table.'); + redirect($D.pages.table,'Slide Id Is Undefined. Redirecting To Flex Table.'); } // get states parameters diff --git a/apps/labeling/labeling.js b/apps/labeling/labeling.js index 68b146ae8..1409b7cab 100644 --- a/apps/labeling/labeling.js +++ b/apps/labeling/labeling.js @@ -154,7 +154,7 @@ function initCore(){ } function downloadLabel(){ if(!$CAMIC.viewer.pmanager.hasPatches()){ - alert('There is no patches'); + alert('There Is No Patches'); return; } diff --git a/apps/segment/segment.html b/apps/segment/segment.html index 8ac6ae76b..da9ecdc29 100755 --- a/apps/segment/segment.html +++ b/apps/segment/segment.html @@ -163,7 +163,7 @@ STORE.findSlide($D.params.slide, $D.params.study, $D.params.specimen, $D.params.location).then(x=>{ let offset = parseInt($D.params.offset,10) || 0; if(x.length == 0 || offset >= x.length){ - redirect($D.pages.table,'No Slide Found. Redirecting to Table.'); + redirect($D.pages.table,'No Slide Found. Redirecting To Table.'); } else { newParams = $D.params delete newParams.data @@ -176,13 +176,13 @@ } }).catch(e=>{ console.warn(e) - redirect($D.pages.table,'Redirecting to Table.'); + redirect($D.pages.table,'Redirecting To Table.'); }) // find the associated slideID // open viewer with that slideID } else { - redirect($D.pages.table,'Slide is undefined. Redirecting to Table.'); + redirect($D.pages.table,'Slide Is Undefined. Redirecting To Table.'); } // get states parameters diff --git a/apps/segment/segment.js b/apps/segment/segment.js index 5ecbba4b7..577f3f5b8 100644 --- a/apps/segment/segment.js +++ b/apps/segment/segment.js @@ -290,7 +290,7 @@ function checkSize(imgColl, imagingHelper) { // check that image size is ok if (width * height > 8000000) { - alert("Selected ROI too large, current version is limited to 4 megapixels"); + alert("Selected ROI Too Large, Current Version Is Limited To 4 Megapixels"); // Clear the rectangle canvas-draw-overlay.clear() $CAMIC.viewer.canvasDrawInstance.clear(); return {}; //throw('image too large') diff --git a/apps/segment/segmentpanel/segmentpanel.js b/apps/segment/segmentpanel/segmentpanel.js index 47cf9c3af..96cc4159c 100644 --- a/apps/segment/segmentpanel/segmentpanel.js +++ b/apps/segment/segmentpanel/segmentpanel.js @@ -111,7 +111,7 @@ SegmentPanel.prototype.close = function(){ }; SegmentPanel.prototype.save = function(){ - alert('Saving Image and Mask!'); + alert('Saving Image And Mask!'); }; SegmentPanel.prototype.showThreshBar = function(){ diff --git a/apps/table.html b/apps/table.html index 7057787c3..38f6fa236 100644 --- a/apps/table.html +++ b/apps/table.html @@ -306,7 +306,7 @@ if(i==0) default_btn.push("NO DATA") else default_btn.push('') }); - const btn = `` + const btn = `` default_btn.push(btn); return [default_btn]; } diff --git a/apps/viewer/uicallbacks.js b/apps/viewer/uicallbacks.js index 888353688..0508103fb 100644 --- a/apps/viewer/uicallbacks.js +++ b/apps/viewer/uicallbacks.js @@ -187,7 +187,7 @@ label.style.width = 0; function draw(e){ if(!$CAMIC.viewer.canvasDrawInstance){ - alert('draw doesn\'t initialize'); + alert('Draw Doesn\'t Initialize'); return; } const state = +e.state; @@ -252,7 +252,7 @@ function annotationOff(){ if(!$CAMIC.viewer.canvasDrawInstance) return; const canvasDraw = $CAMIC.viewer.canvasDrawInstance; - if(canvasDraw._draws_data_.length && confirm(`Do you want to save annotation before you leave?`)){ + if(canvasDraw._draws_data_.length && confirm(`Do You Want To Save Annotation Before You Leave?`)){ saveAnnotation(); }else{ canvasDraw.clear(); @@ -389,9 +389,9 @@ function anno_delete(data){ const annotationData = $D.overlayers.find(d=>d.data && d.data._id.$oid == data.oid); let message; if(annotationData.data.geometries){ - message = `Are you sure you want to delete this Annotation {ID:${data.id}} with ${annotationData.data.geometries.features.length} mark(s)?`; + message = `Are You Sure You Want To Delete This Annotation {ID:${data.id}} With ${annotationData.data.geometries.features.length} Mark(s)?`; }else{ - message = `Are you sure you want to delete this markup {ID:${data.id}}?`; + message = `Are You Sure You Want To Delete This Markup {ID:${data.id}}?`; } $UI.annotPopup.close(); if(!confirm(message)) return; @@ -499,7 +499,7 @@ function anno_callback(data){ // has Path? if($CAMIC.viewer.canvasDrawInstance._path_index===0){ - alert('No Markup on Annotation.'); + alert('No Markup On Annotation.'); return; } // save @@ -652,7 +652,7 @@ function loadAnnotationById(camic, layerData ,callback){ layerData.item.loading = true; const item = layerData.item; - Loading.open(document.body,'loading layers...'); + Loading.open(document.body,'Loading Layers...'); $CAMIC.store.getMarkByIds([item.id],$D.params.data.name) .then(data =>{ @@ -692,9 +692,10 @@ function loadAnnotationById(camic, layerData ,callback){ return [Math.round(point[0]*imgWidth),Math.round(point[1]*imgHeight)]; }); d.properties.style = { - color: "#7CFC00", + color: "#000080", lineCap: "round", - lineJoin: "round" + lineJoin: "round", + isFill:false }; return { _id:d._id, @@ -705,6 +706,8 @@ function loadAnnotationById(camic, layerData ,callback){ }); // if(item) data[0].isShow = item.isShow; item.render = old_anno_render; + item.clickable = false; + item.hoverable = false; }else{ data[0].geometries = VieweportFeaturesToImageFeatures(camic.viewer, data[0].geometries); item.data = data[0]; @@ -796,7 +799,7 @@ function hostedHeatmap(){ if (typeof list === "undefined") { list = [] } // get heatmap data if(!list.length){ - alert(`${slide} has No heatmap data.`); + alert(`${slide} Has No Heatmap Data.`); return; } createHeatMapList(list); @@ -849,7 +852,7 @@ function imgboxHeatmap(){ data.provenance.image.slide = slide const execId = data.provenance.analysis.execution_id; - Loading.open(document.body,'loading Heatmap...'); + Loading.open(document.body,'Loading Heatmap...'); $CAMIC.store.addHeatmap(data).then(rs=>{ window.location.href = `../heatmap/heatmap.html${window.location.search}&execId=${execId}`; }).catch(e=>{ @@ -892,6 +895,9 @@ function anno_render(ctx,data){ //DrawHelper.draw(this._canvas_ctx, this.data.canvasData); } function old_anno_render(ctx,data){ + const imagingHelper = this.viewer.imagingHelper; + const lineWidth = (imagingHelper.physicalToDataX(1) - imagingHelper.physicalToDataX(0))>> 0; + ctx.lineWidth = lineWidth; DrawHelper.draw(ctx, data); } diff --git a/apps/viewer/viewer.html b/apps/viewer/viewer.html index 6aae684ea..a5ac0b7a2 100644 --- a/apps/viewer/viewer.html +++ b/apps/viewer/viewer.html @@ -186,7 +186,7 @@ STORE.findSlide($D.params.slide, $D.params.study, $D.params.specimen, $D.params.location).then(x=>{ let offset = parseInt($D.params.offset,10) || 0; if(x.length == 0 || offset >= x.length){ - redirect($D.pages.table,'No Slide Found. Redirecting to Table.'); + redirect($D.pages.table,'No Slide Found. Redirecting To Table.'); } else { newParams = $D.params delete newParams.data diff --git a/components/loading/loading.js b/components/loading/loading.js index e69d8632f..e939b5823 100644 --- a/components/loading/loading.js +++ b/components/loading/loading.js @@ -15,7 +15,7 @@ Loading.instance = null; * @property {Element} the text element of Loading page. */ Loading.text = null; -Loading.open = function(parentNode ,text = 'loading...',zIndex=999){ +Loading.open = function(parentNode ,text = 'Loading...',zIndex=999){ if(!Loading.instance) Loading.instance = Loading.createInstance(); if(parentNode !== Loading.instance.parentNode) Loading.close(); Loading.instance.style.zIndex = zIndex; diff --git a/core/CaMic.js b/core/CaMic.js index 3d12418ca..4b9f1a5b3 100644 --- a/core/CaMic.js +++ b/core/CaMic.js @@ -18,7 +18,7 @@ class CaMic{ * */ constructor(divId, slideQuery, options){ - Loading.open(document.body, 'CaMicroscope is initializing...'); + Loading.open(document.body, 'CaMicroscope Is Initializing...'); // initalize viewer this.setting = { id: divId, @@ -141,7 +141,7 @@ class CaMic{ * Loads the staged image */ loadImg(func){ - Loading.open(document.body, 'CaMicroscope is loading images ...'); + Loading.open(document.body, 'CaMicroscope Is Loading Images ...'); // loads current image // if id is set, use id var slidePromise; @@ -154,7 +154,7 @@ class CaMic{ slidePromise .then((x)=>{ if(!x || !OpenSeadragon.isArray(x) || !x.length || !x[0].location){ - redirect($D.pages.table,`Can't find the slide information`); + redirect($D.pages.table,`Can't Find The Slide Information`); return; } let data = x[0]; @@ -166,8 +166,8 @@ class CaMic{ }.bind(this), error: function ( xhr, exc ) { console.log(xhr, exc); - Loading.text.textContent = 'Something wrong with this Slide... X_X'; - if(func && typeof func === 'function') func.call(null,{hasError:true,isServiceError:true,message:'Something wrong with this Slide... X_X'}); + Loading.text.textContent = 'Something Wrong With This Slide... X_X'; + if(func && typeof func === 'function') func.call(null,{hasError:true,isServiceError:true,message:'Something Wrong With This Slide... X_X'}); }.bind(this), }); @@ -211,7 +211,7 @@ class CaMic{ imagingHelper.setMaxZoom(1); data.url = "../../img/IIP/raw/?DeepZoom="+ data["location"] + ".dzi"; if(func && typeof func === 'function') func.call(null,data); - Loading.text.textContent = `loading slide's tiles...`; + Loading.text.textContent = `Loading Slide's Tiles...`; } /** @@ -252,7 +252,7 @@ class CaMic{ this.drawContextmenu.addHandler('clear',function(e){ if(this.viewer.canvasDrawInstance._draws_data_.length == 0) return; - if(confirm("Do you want to clear all markups?")) this.viewer.canvasDrawInstance.clear(); + if(confirm("Do You Want To Clear All Markups?")) this.viewer.canvasDrawInstance.clear(); }.bind(this)); // this.drawContextmenu.addHandler('draw-mode-changed',function(e){ diff --git a/core/Store.js b/core/Store.js index 6bc857fb7..e9f1d0112 100644 --- a/core/Store.js +++ b/core/Store.js @@ -266,14 +266,19 @@ class Store { **/ findMarkTypes(slide, name) { let suffix = "Mark/types" - + var query = {} - // + // if(!slide) { console.error('Store.findMarkTypes needs slide ... '); return null; } - query.slide = slide + // numeric->str coerce + if ((parseInt(slide)==slide)||(parseFloat(slide)==slide)){ + query.slide = '"' + slide + '"' + } else { + query.slide = slide + } if (name) { query.name = name suffix = "Mark/typesExec" @@ -402,11 +407,11 @@ class Store { var suffix = "Heatmap/threshold" var url = this.base + suffix; var query = {} - + if (subject) { query.subject = subject } - + if (caseid) { query.case = caseid } @@ -430,7 +435,7 @@ class Store { * add a Heatmap Edit Data * @param {object} json - the heatmap edit data * @returns {promise} - promise which resolves with response - * + * **/ addHeatmapEdit(json) { var suffix = "HeatmapEdit/post" @@ -455,15 +460,15 @@ class Store { var suffix = "HeatmapEdit/update" var url = this.base + suffix; var query = {} - + if (user) { query.user = user } - + if (subject) { query.subject = subject } - + if (caseid) { query.case = caseid } @@ -486,15 +491,15 @@ class Store { var suffix = "HeatmapEdit/find" var url = this.base + suffix; var query = {} - + if (user) { query.user = user } - + if (subject) { query.subject = subject } - + if (caseid) { query.case = caseid } @@ -520,11 +525,11 @@ class Store { if (user) { query.user = user } - + if (subject) { query.subject = subject } - + if (caseid) { query.case = caseid } diff --git a/core/extension/openseadragon-canvas-draw-overlay.js b/core/extension/openseadragon-canvas-draw-overlay.js index aec48092d..94f5f1110 100644 --- a/core/extension/openseadragon-canvas-draw-overlay.js +++ b/core/extension/openseadragon-canvas-draw-overlay.js @@ -579,7 +579,7 @@ if(!(this.drawMode === 'line' ||this.drawMode == 'grid')){ let isIntersect = false; if(isSelfIntersect(this._current_path_.geometry.coordinates[0])){ - alert('A Self-Intersecting Polygon will cause inaccurate Area and circumference.'); + alert('A Self-Intersecting Polygon Will Cause Inaccurate Area and Circumference.'); isIntersect = true; } let sqmpsqp = null; // square microns per square pixels diff --git a/core/extension/openseadragon-labeling/openseadragon-labeling.css b/core/extension/openseadragon-labeling/openseadragon-labeling.css index 2bbf9b4eb..b8e07fc9d 100644 --- a/core/extension/openseadragon-labeling/openseadragon-labeling.css +++ b/core/extension/openseadragon-labeling/openseadragon-labeling.css @@ -97,14 +97,9 @@ z-index:999; box-sizing:border-box; top:0; - left:calc(100% + 5px); - /*min-width: 150px;*/ - width:100%; - height:100%; - min-height:100px; - min-width:100px; + left:calc(100% + 3px); + background:rgb(0,0,0); - padding:3px; display:none; } @@ -116,8 +111,18 @@ width:100%; height:100%; min-height:100px; + max-height:250px; min-width:100px; - resize: none; + max-width:300px; + /*resize: none;*/ +} +.patch .note_panel select { + overflow: hidden; +} + +.patch .note_panel select option { + font-weight: bold; + padding:5px 10px; } .patch .corner { diff --git a/core/extension/openseadragon-labeling/openseadragon-labeling.js b/core/extension/openseadragon-labeling/openseadragon-labeling.js index 75e189ef3..ce26d7879 100644 --- a/core/extension/openseadragon-labeling/openseadragon-labeling.js +++ b/core/extension/openseadragon-labeling/openseadragon-labeling.js @@ -37,14 +37,17 @@ this.isPoint = false; this.isCreatePatch = true; this.viewer = options.viewer; - - + const {x, y, width, height} = this.viewer.viewport.imageToViewportRectangle(new OpenSeadragon.Rect(0, 0, 1024, 1024)); + this.width = width; + this.height = height; //this.status this.patches = []; this.activePatch = null; + this.selection = options.selection || null; + // save key handler this.keyHandler = this.viewer.innerTracker.keyHandler; @@ -120,11 +123,13 @@ } function _click(e){ + // if(this.activePatch){ + // this.activePatch.deactive(); + // return + // } + const img_point = this.viewer.viewport.windowToImageCoordinates(new $.Point(e.originalEvent.clientX,e.originalEvent.clientY)); const view_point = this.viewer.viewport.windowToViewportCoordinates(new $.Point(e.originalEvent.clientX,e.originalEvent.clientY)); - //const img_point = this.viewer.viewport.windowToImageCoordinates(new $.Point(e.clientX,e.clientY)); - //const view_point = this.viewer.viewport.windowToViewportCoordinates(new $.Point(e.clientX,e.clientY)); - if(0 > img_point.x || this.imgWidth < img_point.x || 0 > img_point.y || this.imgHeight < img_point.y || !this.isCreatePatch) return; @@ -136,7 +141,7 @@ // create new one let options = { data:'', - //size:new $.Point(width,height), + size:new $.Point(this.width, this.height), center:view_point, viewer:this.viewer, color:'#7cfc00' @@ -146,19 +151,16 @@ options = this.activePatch.templateOptions(options); options.center = view_point; if(!this.isPoint && this.activePatch.isPoint){ - const viewer_bounds = this.viewer.viewport.getBounds(); - const width = viewer_bounds.width * 0.1; - const height = viewer_bounds.height * 0.1; - options.size = new $.Point(width,height); + options.size = new $.Point(this.width, this.height); } - }else { - const viewer_bounds = this.viewer.viewport.getBounds(); - const width = viewer_bounds.width * 0.1; - const height = viewer_bounds.height * 0.1; - options.size = new $.Point(width,height); - } - options.isPoint = this.isPoint; + }else if(this.patches[this.patches.length-1]){ + options = this.patches[this.patches.length-1].templateOptions(options); + options.center = view_point; + } + options.isPoint = this.isPoint; + options.manager = this; + console.log('options:',options); this.patches.push(new $.Patch(options)); } @@ -216,11 +218,20 @@ // element this.element = document.createElement('div'); this.element.id = this.id; + this.manager = options.manager; + const rect = getRect(options.center, options.size, options.viewer, options.isPoint); this.color = options.color; + + // only for note is list (select) + this.selIdx = options.selIdx || 0; + if(this.manager&&this.manager.selection&&this.manager.selection[0]&&this.manager.selection[0].color){ + options.color = this.color = this.manager.selection[this.selIdx].color; + } + this.data = options.data || ''; - // create ui part + // create ui part if(options.isPoint){ createPointElement(this.element, options); }else{ @@ -258,6 +269,24 @@ if(ctrl) ctrl.style.borderColor = color; }) + // create selector event + if(this.manager&&this.manager.selection){ + const hasColor = this.manager.selection[0].color?true:false; + const sel = element.querySelector('.note_panel select'); + sel.selectedIndex = +this.selIdx; + sel.addEventListener('change',function(e){ + // set color + if(!hasColor) return; + const color = this.manager.selection[sel.selectedIndex].color; + box.style.background = color; + input.value = color; + element.style.borderColor = color; + const ctrl = element.querySelector('.controls'); + if(ctrl) ctrl.style.borderColor = color; + }.bind(this)) + if(hasColor&&!this.isPoint) this.element.querySelector('.color').style.display = 'none'; + } + // trackers this.patchTrackers = {}; @@ -280,17 +309,25 @@ releaseHandler: clickOnRemove.bind(this) }); + this.patchTrackers['color'] = new $.MouseTracker({ element: colorIcon, pressHandler: press.bind(this), releaseHandler: clickOnColor.bind(this) }); + if(this.manager&&this.manager.selection&&this.manager&&this.manager.selection[0].color&&this.isPoint) this.patchTrackers['color'].setTracking(false); + this.patchTrackers['note'] = new $.MouseTracker({ element: noteIcon, pressHandler: press.bind(this), releaseHandler: clickOnNote.bind(this) }); + const notePanel = this.element.querySelector('.note_panel'); + this.patchTrackers['note_panel'] = new $.MouseTracker({ + element: notePanel + }); + // adjust the size of patch if(!options.isPoint){ const resizeIcon = this.element.querySelector('.corner'); @@ -311,6 +348,17 @@ this.element.querySelector('.info_block').textContent = `${Math.round(rect.width)}x${Math.round(rect.height)}px`; } + function createSelector(options){ + const sel = document.createElement('select'); + sel.size = options.length; + options.forEach((opt,idx) => { + const option = document.createElement('option'); + option.text = opt.text; + option.value = opt.value!=undefined?opt.value:idx; + sel.appendChild(option); + }); + return sel; + } @@ -401,7 +449,11 @@ $.Patch.prototype.openNotePanel = function(e){ this.viewer.innerTracker.keyHandler = null; this.element.querySelector('.note_panel').style.display = 'block'; - this.element.querySelector('.note_panel textarea').focus(); + if(this.manager.selection){ + this.element.querySelector('.note_panel select').focus(); + }else{ + this.element.querySelector('.note_panel textarea').focus(); + } } $.Patch.prototype.closeNotePanel = function(e){ @@ -433,12 +485,18 @@ } $.Patch.prototype.templateOptions = function(){ - return { - data:this.element.querySelector('.note_panel textarea').value, - size:new $.Point(this.overlay.width,this.overlay.height), - viewer:this.viewer, - color:this.element.querySelector('.color input').value - } + const options = { + size:new $.Point(this.overlay.width,this.overlay.height), + viewer:this.viewer, + color:this.element.querySelector('.color input').value + } + if(this.manager&&this.manager.selection){ + options.data = this.element.querySelector('.note_panel select option:checked').text; + options.selIdx = +this.element.querySelector('.note_panel select').selectedIndex; + }else{ + options.data = this.element.querySelector('.note_panel textarea').value; + } + return options; } $.Patch.prototype.toJSON = function(coordinates = 'normalize'){ // l/image @@ -538,11 +596,17 @@ // note panel const note_panel = document.createElement('div'); note_panel.classList.add('note_panel'); - const textarea = document.createElement('textarea'); - textarea.textContent = options.data; - note_panel.appendChild(textarea); - elt.appendChild(note_panel); + if(options.manager&&options.manager.selection && Array.isArray(options.manager.selection)){ + const selector = createSelector(options.manager.selection); + note_panel.appendChild(selector); + }else{ + const textarea = document.createElement('textarea'); + textarea.textContent = options.data; + note_panel.appendChild(textarea); + } + + elt.appendChild(note_panel); // corner const corner = document.createElement('div'); corner.classList.add('material-icons'); @@ -579,20 +643,11 @@ dot.style.background = options.color; dot.appendChild(input); elt.appendChild(dot); - - // const dot = document.createElement('div'); - // dot.classList.add('dot'); - // elt.appendChild(dot); const controls = document.createElement('div'); controls.classList.add('controls'); controls.style.borderColor = options.color; elt.appendChild(controls); - - // const info = document.createElement('div'); - // info.classList.add('info_block'); - // controls.appendChild(info); - // controls // remove const clear = document.createElement('div'); @@ -611,9 +666,15 @@ // note panel const note_panel = document.createElement('div'); note_panel.classList.add('note_panel'); - const textarea = document.createElement('textarea'); - textarea.textContent = options.data; - note_panel.appendChild(textarea); + + if(options.manager&&options.manager.selection && Array.isArray(options.manager.selection)){ + const selector = createSelector(options.manager.selection); + note_panel.appendChild(selector); + }else{ + const textarea = document.createElement('textarea'); + textarea.textContent = options.data; + note_panel.appendChild(textarea); + } controls.appendChild(note_panel); } diff --git a/core/extension/openseadragon-overlays-manage.js b/core/extension/openseadragon-overlays-manage.js index 3a95214b4..878eb7fae 100644 --- a/core/extension/openseadragon-overlays-manage.js +++ b/core/extension/openseadragon-overlays-manage.js @@ -163,7 +163,7 @@ for(let j = 0;j < layer.data.length;j++){ const path = layer.data[j].geometry.path; const style = layer.data[j].properties.style; - if(path.contains(img_point.x,img_point.y)){ + if(layer.hoverable&&path.contains(img_point.x,img_point.y)){ this.resize(); this.highlightPath = path; this.highlightStyle = style; @@ -187,7 +187,7 @@ const path = features[j].geometry.path; const style = features[j].properties.style; this.subIndex = null; - if(path.contains(img_point.x,img_point.y)){ + if(layer.hoverable&&path.contains(img_point.x,img_point.y)){ this.resize(); this.highlightPath = path; this.highlightStyle = style; @@ -210,7 +210,8 @@ * @param {Event} e the event */ pathClick:function(e){ - this._viewer.raiseEvent('canvas-lay-click',{position:{x:e.clientX, y:e.clientY},data:this.highlightLayer?this.highlightLayer.data:null}); + if(this.highlightLayer&&this.highlightLayer.clickable) + this._viewer.raiseEvent('canvas-lay-click',{position:{x:e.clientX, y:e.clientY},data:this.highlightLayer?this.highlightLayer.data:null}); }, /** @@ -320,7 +321,17 @@ ctx.fillStyle = hexToRgbA(style.color,0.5); ctx.strokeStyle = style.color; ctx.lineWidth = style.lineWidth; - path.fill(this._hover_ctx_); + + + if(style.isFill ==undefined || style.isFill){ + path.fill(this._hover_ctx_); + }else{ + const imagingHelper = this._viewer.imagingHelper; + const lineWidth = (imagingHelper.physicalToDataX(2) - imagingHelper.physicalToDataX(0))>> 0; + ctx.lineWidth = lineWidth; + path.stroke(this._hover_ctx_); + } + }, /** @@ -335,7 +346,7 @@ return; }; this.drawOnCanvas(this.drawOnDisplay,[this._display_ctx_]); - if(this.highlightPath)this.drawOnCanvas(this.drawOnHover,[this._hover_ctx_,this._div,this.highlightPath,this.highlightStyle]); + if(this.highlightPath&& this.highlightLayer&& this.highlightLayer.hoverable)this.drawOnCanvas(this.drawOnHover,[this._hover_ctx_,this._div,this.highlightPath,this.highlightStyle]); }, @@ -357,7 +368,7 @@ console.warn('duplicate overlay ID'); return; } - + options.viewer = this._viewer const lay = new Overlay(options) this.overlays.push(lay); // TODO redraw @@ -472,8 +483,19 @@ this.id = options.id; this.data = options.data; this.render = options.render; - this.clickable = options.clickable || false; - this.hoverable = options.hoverable || false; + //this.clickable = options.clickable || true; + //this.hoverable = options.hoverable || true; + this.viewer = options.viewer; + if(options.clickable!=null && options.clickable == false){ + this.clickable = options.clickable + }else{ + this.clickable = true; + } + if(options.hoverable!=null && options.hoverable == false){ + this.hoverable = options.hoverable + }else{ + this.hoverable = true; + } if(options.isShow!=null && options.isShow == false){ this.isShow = options.isShow }else{ diff --git a/dist/pathdb_package.js b/dist/pathdb_package.js index 058f9cf58..b936fc4a9 100644 --- a/dist/pathdb_package.js +++ b/dist/pathdb_package.js @@ -1,4 +1,4 @@ parcelRequire=function(e,r,n,t){var i="function"==typeof parcelRequire&&parcelRequire,o="function"==typeof require&&require;function u(n,t){if(!r[n]){if(!e[n]){var f="function"==typeof parcelRequire&&parcelRequire;if(!t&&f)return f(n,!0);if(i)return i(n,!0);if(o&&"string"==typeof n)return o(n);var c=new Error("Cannot find module '"+n+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[n][1][r]||r};var l=r[n]=new u.Module(n);e[n][0].call(l.exports,p,l,l.exports,this)}return r[n].exports;function p(e){return u(p.resolve(e))}}u.isParcelRequire=!0,u.Module=function(e){this.id=e,this.bundle=u,this.exports={}},u.modules=e,u.cache=r,u.parent=i,u.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]};for(var f=0;f0&&void 0!==arguments[0]&&arguments[0],t=StatesHelper.getCurrentStates(e);if(t)return console.log(t),t=StatesHelper.encodeStates(t),""+location.origin+location.pathname+"?slideId="+$D.params.slideId+"&states="+$D.params.states+"&mode="+$D.params.mode},CaMic.prototype.default_loadImg=CaMic.prototype.loadImg,CaMic.prototype.loadImg=function(e){var t=this,r=new URLSearchParams(window.location.search).get("slideId");this.slideId=r,this.slideName=r,this.study="",this.specimen="",this.subject_id="",this.case_id="",this.image_id="",this.study_id="",this.store.getSlide(r).then(function(r){if(r=r[0],console.log(r),t.mpp=1e9,r.field_mpp_y&&r.field_mpp_y.length>=1&&(t.mpp_y=r.field_mpp_y[0].value,t.mpp=t.mpp_y),r.field_mpp_x&&r.field_mpp_x.length>=1&&(t.mpp_x=r.field_mpp_x[0].value,t.mpp=t.mpp_x),r.field_subject_id&&(t.subject_id=r.field_subject_id[0].value),r.field_case_id&&(t.case_id=r.field_case_id[0].value),r.field_image_id&&(t.image_id=r.field_image_id[0].value),r.field_study_id&&(t.study_id=r.field_study_id[0].value),!(r.field_iip_path&&r.field_iip_path.length>=1))throw"No image location --could be token";t.location=r.field_iip_path[0].value,t.url="../../img/IIP/raw/?DeepZoom="+t.location+".dzi",t.viewer.open(t.url),t.viewer.mpp=t.mpp,t.viewer.mpp_x=t.mpp_x,t.viewer.mpp_y=t.mpp_y,t.mpp&&1e9!=t.mpp&&t.createScalebar(t.mpp),new OpenSeadragonImaging.ImagingHelper({viewer:t.viewer}).setMaxZoom(1);var o={};o._id=t.slideId,o.name=t.slideName,o.subject_id=t.subject_id,o.case_id=t.case_id,o.image_id=t.image_id,o.study_id=t.study_id,o.study=t.study,o.specimen=t.specimen,o.mpp=t.mpp,o.mpp_x=t.mpp_x,o.mpp_y=t.mpp_y,o.location=t.location,o.url=t.url,e&&"function"==typeof e&&e.call(null,o),Loading.text.textContent="loading slide's tiles..."}).catch(function(e){console.error(e),Loading.text.textContent="ERROR - PathDB Image Error (Try a refresh)"})}}e(),console.warn("This setup is intended for pathdb"); +function e(){function e(e){var t=RegExp(e+"[^;]+").exec(document.cookie);return decodeURIComponent(t?t.toString().replace(/^[^=]+./,""):"")}console.log("PathDbMods()..."),fetch("/jwt/token",{method:"GET",credentials:"include"}).then(function(e){return e.json()}).then(function(e){console.log(e),e.hasOwnProperty("token")&&e.token&&(document.cookie="token="+e.token+";")}),console.warn("{PathDB mods enabled}"),Store.prototype.default_findMark=Store.prototype.findMark,Store.prototype.findMark=function(e,t,r,o,i,n,a,d,s,p){var l=this,c=this.base+"Mark/find",u={};return e&&(u.slide=e),t&&(u.name=t),r&&(u.specimen=r),o&&(u.study=o),i&&(u.footprint=i),n&&(u.source=n),a&&(u.x0=a),d&&(u.x1=d),s&&(u.y0=s),p&&(u.y1=p),fetch(c+"?"+objToParamStr(u),{credentials:"same-origin",mode:"cors"}).then(this.errorHandler).then(function(e){return l.filterBroken(e,"mark")})},Store.prototype.getMarkByIds=function(e,t,r,o,i,n,a,d,s,p){var l=this;if(!Array.isArray(e)||!t)return{hasError:!0,message:"args are illegal"};var c=this.base+"Mark/multi",u={},f=e.map(function(e){return'"'+e+'"'}).join(",");return u.name="["+f+"]",u.slide=t,r&&(u.study=r),o&&(u.specimen=o),i&&(u.source=i),n&&(u.footprint=n),a&&(u.x0=a),d&&(u.x1=d),s&&(u.y0=s),p&&(u.y1=p),fetch(c+"?"+objToParamStr(u),{credentials:"same-origin",mode:"cors"}).then(this.errorHandler).then(function(e){return l.filterBroken(e,"mark")})},Store.prototype.findMarkTypes=function(e,t){var r="Mark/types",o=this.base+r,i={};return e?(parseInt(e)==e||parseFloat(e)==e?i.slide='"'+e+'"':i.slide=e,t&&(i.name=t,r="Mark/typesExec"),fetch(o+"?"+objToParamStr(i),{credentials:"same-origin",mode:"cors"}).then(this.errorHandler)):(console.error("Store.findMarkTypes needs slide ... "),null)},Store.prototype.default_findSlide=Store.prototype.findSlide,Store.prototype.findSlide=function(t,r,o,i){return fetch("/node/"+t+"?_format=json",{mode:"cors",headers:new Headers({Authorization:"Bearer "+e("token")})}).then(function(e){return e.ok?e.json().then(function(e){return[e]}):{error:!e.ok,text:e.statusText,url:e.url}})},Store.prototype.default_getSlide=Store.prototype.getSlide,Store.prototype.getSlide=function(t){return fetch("/node/"+t+"?_format=json",{mode:"cors",headers:new Headers({Authorization:"Bearer "+e("token")})}).then(function(e){return e.ok?e.json().then(function(e){return[e]}):{error:!e.ok,text:e.statusText,url:e.url}})},Store.prototype.default_findHeatmapType=Store.prototype.findHeatmapType,Store.prototype.findHeatmapType=function(e,t){var r=this;return this.getSlide(e).then(function(e){var t=r.base+"Heatmap/types",o={};return(e=e[0]).field_subject_id&&(o.subject=e.field_subject_id[0].value),e.field_case_id&&(o.case=e.field_case_id[0].value,o.slide=e.field_case_id[0].value),fetch(t+"?"+objToParamStr(o),{credentials:"include",mode:"cors"}).then(r.errorHandler).then(function(e){return r.filterBroken(e,"heatmap")})}).catch(function(e){console.error(e)})},Store.prototype.default_findHeatmap=Store.prototype.findHeatmap,Store.prototype.findHeatmap=function(e,t){var r=this;return this.getSlide(e).then(function(e){var o=r.base+"Heatmap/find",i={};return(e=e[0]).field_subject_id&&(i.subject=e.field_subject_id[0].value),e.field_case_id&&(i.case=e.field_case_id[0].value,i.slide=e.field_case_id[0].value),t&&(i.name=t),fetch(o+"?"+objToParamStr(i),{credentials:"include",mode:"cors"}).then(r.errorHandler).then(function(e){return r.filterBroken(e,"heatmap")})}).catch(function(e){console.error(e)})},Store.prototype.default_getHeatmap=Store.prototype.getHeatmap,Store.prototype.getHeatmap=function(e,t){var r=this;return this.getSlide(e).then(function(e){var o=r.base+"Heatmap/get",i={};return(e=e[0]).field_subject_id&&(i.subject=e.field_subject_id[0].value),e.field_case_id&&(i.case=e.field_case_id[0].value),t&&(i.exec=t),fetch(o+"?"+objToParamStr(i),{credentials:"include",mode:"cors"}).then(r.errorHandler).then(function(e){return r.filterBroken(e,"heatmap")})}).catch(function(e){console.error(e)})},StatesHelper.prototype.default_getCurrentStatesURL=StatesHelper.prototype.getCurrentStatesURL,getCurrentStatesURL=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=StatesHelper.getCurrentStates(e);if(t)return console.log(t),t=StatesHelper.encodeStates(t),""+location.origin+location.pathname+"?slideId="+$D.params.slideId+"&states="+$D.params.states+"&mode="+$D.params.mode},CaMic.prototype.default_loadImg=CaMic.prototype.loadImg,CaMic.prototype.loadImg=function(e){var t=this,r=new URLSearchParams(window.location.search).get("slideId");this.slideId=r,this.slideName=r,this.study="",this.specimen="",this.subject_id="",this.case_id="",this.image_id="",this.study_id="",this.store.getSlide(r).then(function(r){if(r=r[0],console.log(r),t.mpp=1e9,r.field_mpp_y&&r.field_mpp_y.length>=1&&(t.mpp_y=r.field_mpp_y[0].value,t.mpp=t.mpp_y),r.field_mpp_x&&r.field_mpp_x.length>=1&&(t.mpp_x=r.field_mpp_x[0].value,t.mpp=t.mpp_x),r.field_subject_id&&(t.subject_id=r.field_subject_id[0].value),r.field_case_id&&(t.case_id=r.field_case_id[0].value),r.field_image_id&&(t.image_id=r.field_image_id[0].value),r.field_study_id&&(t.study_id=r.field_study_id[0].value),!(r.field_iip_path&&r.field_iip_path.length>=1))throw"No image location --could be token";t.location=r.field_iip_path[0].value,t.url="../../img/IIP/raw/?DeepZoom="+t.location+".dzi",t.viewer.open(t.url),t.viewer.mpp=t.mpp,t.viewer.mpp_x=t.mpp_x,t.viewer.mpp_y=t.mpp_y,t.mpp&&1e9!=t.mpp&&t.createScalebar(t.mpp),new OpenSeadragonImaging.ImagingHelper({viewer:t.viewer}).setMaxZoom(1);var o={};o._id=t.slideId,o.name=t.slideName,o.subject_id=t.subject_id,o.case_id=t.case_id,o.image_id=t.image_id,o.study_id=t.study_id,o.study=t.study,o.specimen=t.specimen,o.mpp=t.mpp,o.mpp_x=t.mpp_x,o.mpp_y=t.mpp_y,o.location=t.location,o.url=t.url,e&&"function"==typeof e&&e.call(null,o),Loading.text.textContent="Loading Slide's Tiles..."}).catch(function(e){console.error(e),Loading.text.textContent="ERROR - PathDB Image Error (Try A Refresh)"})}}e(),console.warn("This Setup Is Intended For Pathdb"); },{}]},{},["aJmB"], null) //# sourceMappingURL=/pathdb_package.map \ No newline at end of file diff --git a/dist/pathdb_package.map b/dist/pathdb_package.map index 1e36fcc1b..06a0c6a03 100644 --- a/dist/pathdb_package.map +++ b/dist/pathdb_package.map @@ -1 +1 @@ -{"version":3,"sources":["pathdb_package.js"],"names":["PathDbMods","getCookie","key","cookiestring","RegExp","exec","document","cookie","decodeURIComponent","toString","replace","log","then","x","json","hasOwnProperty","token","warn","prototype","default_findMark","Store","findMark","slide","name","specimen","study","footprint","source","x0","x1","y0","y1","url","base","query","bySlide","fetch","objToParamStr","errorHandler","filterBroken","getMarkByIds","ids","Array","isArray","suffix","stringifiedIds","map","id","join","findMarkTypes","error","default_findSlide","findSlide","location","Headers","response","ok","statusText","default_getSlide","getSlide","default_findHeatmapType","findHeatmapType","data","field_subject_id","subject","value","field_case_id","case","catch","e","default_findHeatmap","findHeatmap","default_getHeatmap","getHeatmap","default_getCurrentStatesURL","StatesHelper","getCurrentStatesURL","isImageCoordinate","states","getCurrentStates","encodeStates","origin","pathname","$D","params","slideId","mode","default_loadImg","CaMic","loadImg","func","pathdb_id","URLSearchParams","window","search","get","slideName","subject_id","case_id","image_id","study_id","store","mpp","field_mpp_y","length","mpp_y","field_mpp_x","mpp_x","field_image_id","field_study_id","field_iip_path","viewer","open","createScalebar","OpenSeadragonImaging","ImagingHelper","setMaxZoom","call","text","textContent","console"],"mappings":"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","file":"pathdb_package.map","sourceRoot":"../package","sourcesContent":["function PathDbMods() {\n console.log(\"PathDbMods()...\");\n // put the auth jwt in cookie as token\n fetch(\"/jwt/token\", {\n method: 'GET',\n credentials: 'include'\n }).then(x => x.json()).then(x => {\n console.log(x)\n if (x.hasOwnProperty('token') && x.token) {\n document.cookie = \"token=\" + x.token + \";\"\n }\n })\n /**\n Gets a named cookie value\n * @param {string} key - the key to get from the cookie\n **/\n function getCookie(key) {\n var cookiestring = RegExp(\"\" + key + \"[^;]+\").exec(document.cookie);\n return decodeURIComponent(!!cookiestring ? cookiestring.toString().replace(/^[^=]+./, \"\") : \"\");\n }\n console.warn(\"{PathDB mods enabled}\")\n Store.prototype.default_findMark = Store.prototype.findMark\n Store.prototype.findMark = function(slide, name, specimen, study, footprint, source, x0, x1, y0, y1) {\n var suffix = \"Mark/find\"\n var url = this.base + suffix;\n var query = {}\n var bySlideId\n if (slide) {\n query.slide = slide\n }\n if (name) {\n query.name = name\n }\n if (specimen) {\n query.specimen = specimen\n }\n if (study) {\n query.study = study\n }\n if (footprint) {\n query.footprint = footprint\n }\n if (source) {\n query.source = source\n }\n if (x0) {\n query.x0 = x0;\n }\n if (x1) {\n query.x1 = x1;\n }\n if (y0) {\n query.y0 = y0;\n }\n if (y1) {\n query.y1 = y1;\n }\n let bySlide = fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"same-origin\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x => this.filterBroken(x, \"mark\"))\n return bySlide\n }\n Store.prototype.getMarkByIds = function(ids, slide, study, specimen, source, footprint, x0, x1, y0, y1) {\n if (!Array.isArray(ids) || !slide) {\n return {\n hasError: true,\n message: 'args are illegal'\n }\n }\n var bySlideId\n var suffix = \"Mark/multi\"\n var url = this.base + suffix;\n var query = {}\n var stringifiedIds = ids.map(id => `\"${id}\"`).join(',');\n query.name = `[${stringifiedIds}]`;\n query.slide = slide;\n if (study) {\n query.study = study;\n }\n if (specimen) {\n query.specimen = specimen;\n }\n if (source) {\n query.source = source;\n }\n if (footprint) {\n query.footprint = footprint;\n }\n if (x0) {\n query.x0 = x0;\n }\n if (x1) {\n query.x1 = x1;\n }\n if (y0) {\n query.y0 = y0;\n }\n if (y1) {\n query.y1 = y1;\n }\n let bySlide = fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"same-origin\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x => this.filterBroken(x, \"mark\"))\n return bySlide\n }\n Store.prototype.findMarkTypes = function(slide, name) {\n var suffix = \"Mark/types\"\n var url = this.base + suffix;\n var query = {}\n if(!slide) {\n console.error('Store.findMarkTypes needs slide ... ');\n return null;\n }\n query.slide = slide\n if (name) {\n query.name = name\n suffix = \"Mark/typesExec\"\n }\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"same-origin\",\n mode: \"cors\"\n }).then(this.errorHandler)\n return bySlide\n }\n Store.prototype.default_findSlide = Store.prototype.findSlide;\n Store.prototype.findSlide = function(slide, specimen, study, location) {\n var url = \"/node/\" + slide + \"?_format=json\"\n return fetch(url, {\n mode: \"cors\",\n headers: new Headers({\n 'Authorization': 'Bearer ' + getCookie(\"token\"),\n })\n }).then(function(response) {\n if (!response.ok) return {\n error: !response.ok,\n text: response.statusText,\n url: response.url\n };\n return response.json().then(x => [x]);\n })\n }\n Store.prototype.default_getSlide = Store.prototype.getSlide\n Store.prototype.getSlide = function(id) {\n var url = \"/node/\" + id + \"?_format=json\"\n return fetch(url, {\n mode: \"cors\",\n headers: new Headers({\n 'Authorization': 'Bearer ' + getCookie(\"token\"),\n })\n }).then(function(response) {\n if (!response.ok) return {\n error: !response.ok,\n text: response.statusText,\n url: response.url\n };\n return response.json().then(x => [x]);\n })\n }\n\n\n Store.prototype.default_findHeatmapType = Store.prototype.findHeatmapType;\n Store.prototype.findHeatmapType = function(slide, name) {\n return this.getSlide(slide).then(data => {\n\n var suffix = \"Heatmap/types\"\n var url = this.base + suffix;\n var query = {}\n\n data = data[0]\n if (data.field_subject_id) {\n query.subject = data.field_subject_id[0].value\n }\n if (data.field_case_id) {\n query.case = data.field_case_id[0].value\n query.slide = data.field_case_id[0].value\n }\n\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"include\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x=>this.filterBroken(x, \"heatmap\"))\n }).catch(function(e){\n console.error(e);\n })\n\n };\n\n Store.prototype.default_findHeatmap = Store.prototype.findHeatmap;\n Store.prototype.findHeatmap = function(slide, name) {\n return this.getSlide(slide).then(data => {\n\n var suffix = \"Heatmap/find\"\n var url = this.base + suffix;\n var query = {}\n\n data = data[0]\n if (data.field_subject_id) {\n query.subject = data.field_subject_id[0].value\n }\n if (data.field_case_id) {\n query.case = data.field_case_id[0].value\n query.slide = data.field_case_id[0].value\n }\n if(name) query.name = name;\n\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"include\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x=>this.filterBroken(x, \"heatmap\"))\n }).catch(function(e){\n console.error(e);\n })\n };\n Store.prototype.default_getHeatmap = Store.prototype.getHeatmap;\n Store.prototype.getHeatmap = function(slide, exec) {\n return this.getSlide(slide).then(data => {\n\n var suffix = \"Heatmap/get\"\n var url = this.base + suffix;\n var query = {}\n\n data = data[0]\n if (data.field_subject_id) {\n query.subject = data.field_subject_id[0].value\n }\n if (data.field_case_id) {\n query.case = data.field_case_id[0].value\n }\n if(exec) query.exec = exec;\n\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"include\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x=>this.filterBroken(x, \"heatmap\"))\n }).catch(function(e){\n console.error(e);\n })\n };\n\n StatesHelper.prototype.default_getCurrentStatesURL = StatesHelper.prototype.getCurrentStatesURL;\n getCurrentStatesURL = function(isImageCoordinate=false){\n let states = StatesHelper.getCurrentStates(isImageCoordinate);\n if(!states)return;\n console.log(states);\n states = StatesHelper.encodeStates(states);\n return `${location.origin}${location.pathname}?slideId=${$D.params.slideId}&states=${$D.params.states}&mode=${$D.params.mode}`\n };\n\n\n CaMic.prototype.default_loadImg = CaMic.prototype.loadImg\n CaMic.prototype.loadImg = function(func) {\n var urlParams = new URLSearchParams(window.location.search);\n var pathdb_id = urlParams.get('slideId');\n this.slideId = pathdb_id // default value\n this.slideName = pathdb_id\n this.study = \"\"\n this.specimen = \"\"\n this.subject_id = \"\"\n this.case_id = \"\"\n this.image_id = \"\"\n this.study_id = \"\"\n this.store.getSlide(pathdb_id).then(data => {\n data = data[0]\n console.log(data)\n // set mpp\n this.mpp = 1e9\n\n if (data.field_mpp_y && data.field_mpp_y.length >= 1) {\n this.mpp_y = data.field_mpp_y[0].value\n this.mpp = this.mpp_y\n }\n if (data.field_mpp_x && data.field_mpp_x.length >= 1) {\n this.mpp_x = data.field_mpp_x[0].value\n this.mpp = this.mpp_x\n }\n // identifier fields\n if(data.field_subject_id){\n this.subject_id = data.field_subject_id[0].value\n }\n if(data.field_case_id){\n this.case_id = data.field_case_id[0].value\n }\n if(data.field_image_id){\n this.image_id = data.field_image_id[0].value\n }\n if(data.field_study_id){\n this.study_id = data.field_study_id[0].value\n }\n\n if (data.field_iip_path && data.field_iip_path.length >= 1) {\n this.location = data.field_iip_path[0].value\n // MAKE URL FOR IIP\n this.url = \"../../img/IIP/raw/?DeepZoom=\" + this.location + \".dzi\"\n this.viewer.open(this.url);\n } else {\n throw \"No image location --could be token\"\n }\n\n this.viewer.mpp = this.mpp;\n this.viewer.mpp_x = this.mpp_x;\n this.viewer.mpp_y = this.mpp_y;\n\n //set scalebar\n if (this.mpp && this.mpp != 1e9) this.createScalebar(this.mpp)\n var imagingHelper = new OpenSeadragonImaging.ImagingHelper({\n viewer: this.viewer\n });\n imagingHelper.setMaxZoom(1);\n // create item to pass to the callback function, previously x[0] (slide data)\n let x = {}\n x['_id'] = this.slideId\n x.name = this.slideName\n\n // identifier field\n x.subject_id = this.subject_id\n x.case_id = this.case_id\n x.image_id = this.image_id\n x.study_id = this.study_id\n\n x.study = this.study\n x.specimen = this.specimen\n x.mpp = this.mpp;\n x.mpp_x = this.mpp_x;\n x.mpp_y = this.mpp_y;\n x.location = this.location;\n x.url = this.url;\n if (func && typeof func === 'function') {\n func.call(null, x);\n }\n Loading.text.textContent = `loading slide's tiles...`;\n // we may want another init.js or our own callback\n }).catch(e => {\n console.error(e)\n Loading.text.textContent = \"ERROR - PathDB Image Error (Try a refresh)\"\n //if(func && typeof func === 'function') func.call(null,{hasError:true,message:e});\n })\n\n }\n}\n\n\nPathDbMods()\nconsole.warn(\"This setup is intended for pathdb\")\n"]} \ No newline at end of file +{"version":3,"sources":["pathdb_package.js"],"names":["PathDbMods","getCookie","key","cookiestring","RegExp","exec","document","cookie","decodeURIComponent","toString","replace","log","then","x","json","hasOwnProperty","token","warn","prototype","default_findMark","Store","findMark","slide","name","specimen","study","footprint","source","x0","x1","y0","y1","url","base","query","fetch","objToParamStr","errorHandler","filterBroken","getMarkByIds","ids","Array","isArray","suffix","stringifiedIds","map","id","join","findMarkTypes","parseInt","parseFloat","error","default_findSlide","findSlide","location","Headers","response","ok","statusText","default_getSlide","getSlide","default_findHeatmapType","findHeatmapType","data","field_subject_id","subject","value","field_case_id","case","catch","e","default_findHeatmap","findHeatmap","default_getHeatmap","getHeatmap","default_getCurrentStatesURL","StatesHelper","getCurrentStatesURL","isImageCoordinate","states","getCurrentStates","encodeStates","origin","pathname","$D","params","slideId","mode","default_loadImg","CaMic","loadImg","func","pathdb_id","URLSearchParams","window","search","get","slideName","subject_id","case_id","image_id","study_id","store","mpp","field_mpp_y","length","mpp_y","field_mpp_x","mpp_x","field_image_id","field_study_id","field_iip_path","viewer","open","createScalebar","OpenSeadragonImaging","ImagingHelper","setMaxZoom","call","text","textContent","console"],"mappings":"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","file":"pathdb_package.map","sourceRoot":"../package","sourcesContent":["function PathDbMods() {\n console.log(\"PathDbMods()...\");\n // put the auth jwt in cookie as token\n fetch(\"/jwt/token\", {\n method: 'GET',\n credentials: 'include'\n }).then(x => x.json()).then(x => {\n console.log(x)\n if (x.hasOwnProperty('token') && x.token) {\n document.cookie = \"token=\" + x.token + \";\"\n }\n })\n /**\n Gets a named cookie value\n * @param {string} key - the key to get from the cookie\n **/\n function getCookie(key) {\n var cookiestring = RegExp(\"\" + key + \"[^;]+\").exec(document.cookie);\n return decodeURIComponent(!!cookiestring ? cookiestring.toString().replace(/^[^=]+./, \"\") : \"\");\n }\n console.warn(\"{PathDB mods enabled}\")\n Store.prototype.default_findMark = Store.prototype.findMark\n Store.prototype.findMark = function(slide, name, specimen, study, footprint, source, x0, x1, y0, y1) {\n var suffix = \"Mark/find\"\n var url = this.base + suffix;\n var query = {}\n if (slide) {\n query.slide = slide\n }\n if (name) {\n query.name = name\n }\n if (specimen) {\n query.specimen = specimen\n }\n if (study) {\n query.study = study\n }\n if (footprint) {\n query.footprint = footprint\n }\n if (source) {\n query.source = source\n }\n if (x0) {\n query.x0 = x0;\n }\n if (x1) {\n query.x1 = x1;\n }\n if (y0) {\n query.y0 = y0;\n }\n if (y1) {\n query.y1 = y1;\n }\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"same-origin\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x => this.filterBroken(x, \"mark\"))\n }\n Store.prototype.getMarkByIds = function(ids, slide, study, specimen, source, footprint, x0, x1, y0, y1) {\n if (!Array.isArray(ids) || !slide) {\n return {\n hasError: true,\n message: 'args are illegal'\n }\n }\n var suffix = \"Mark/multi\"\n var url = this.base + suffix;\n var query = {}\n var stringifiedIds = ids.map(id => `\"${id}\"`).join(',');\n query.name = `[${stringifiedIds}]`;\n query.slide = slide;\n if (study) {\n query.study = study;\n }\n if (specimen) {\n query.specimen = specimen;\n }\n if (source) {\n query.source = source;\n }\n if (footprint) {\n query.footprint = footprint;\n }\n if (x0) {\n query.x0 = x0;\n }\n if (x1) {\n query.x1 = x1;\n }\n if (y0) {\n query.y0 = y0;\n }\n if (y1) {\n query.y1 = y1;\n }\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"same-origin\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x => this.filterBroken(x, \"mark\"))\n }\n Store.prototype.findMarkTypes = function(slide, name) {\n var suffix = \"Mark/types\"\n var url = this.base + suffix;\n var query = {}\n if(!slide) {\n console.error('Store.findMarkTypes needs slide ... ');\n return null;\n }\n // pathdb numeric->str coerce\n if ((parseInt(slide)==slide)||(parseFloat(slide)==slide)){\n query.slide = '\"' + slide + '\"'\n } else {\n query.slide = slide\n }\n\n if (name) {\n query.name = name\n suffix = \"Mark/typesExec\"\n }\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"same-origin\",\n mode: \"cors\"\n }).then(this.errorHandler)\n }\n Store.prototype.default_findSlide = Store.prototype.findSlide;\n Store.prototype.findSlide = function(slide, specimen, study, location) {\n var url = \"/node/\" + slide + \"?_format=json\"\n return fetch(url, {\n mode: \"cors\",\n headers: new Headers({\n 'Authorization': 'Bearer ' + getCookie(\"token\"),\n })\n }).then(function(response) {\n if (!response.ok) return {\n error: !response.ok,\n text: response.statusText,\n url: response.url\n };\n return response.json().then(x => [x]);\n })\n }\n Store.prototype.default_getSlide = Store.prototype.getSlide\n Store.prototype.getSlide = function(id) {\n var url = \"/node/\" + id + \"?_format=json\"\n return fetch(url, {\n mode: \"cors\",\n headers: new Headers({\n 'Authorization': 'Bearer ' + getCookie(\"token\"),\n })\n }).then(function(response) {\n if (!response.ok) return {\n error: !response.ok,\n text: response.statusText,\n url: response.url\n };\n return response.json().then(x => [x]);\n })\n }\n\n\n Store.prototype.default_findHeatmapType = Store.prototype.findHeatmapType;\n Store.prototype.findHeatmapType = function(slide, name) {\n return this.getSlide(slide).then(data => {\n\n var suffix = \"Heatmap/types\"\n var url = this.base + suffix;\n var query = {}\n\n data = data[0]\n if (data.field_subject_id) {\n query.subject = data.field_subject_id[0].value\n }\n if (data.field_case_id) {\n query.case = data.field_case_id[0].value\n query.slide = data.field_case_id[0].value\n }\n\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"include\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x=>this.filterBroken(x, \"heatmap\"))\n }).catch(function(e){\n console.error(e);\n })\n\n };\n\n Store.prototype.default_findHeatmap = Store.prototype.findHeatmap;\n Store.prototype.findHeatmap = function(slide, name) {\n return this.getSlide(slide).then(data => {\n\n var suffix = \"Heatmap/find\"\n var url = this.base + suffix;\n var query = {}\n\n data = data[0]\n if (data.field_subject_id) {\n query.subject = data.field_subject_id[0].value\n }\n if (data.field_case_id) {\n query.case = data.field_case_id[0].value\n query.slide = data.field_case_id[0].value\n }\n if(name) query.name = name;\n\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"include\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x=>this.filterBroken(x, \"heatmap\"))\n }).catch(function(e){\n console.error(e);\n })\n };\n Store.prototype.default_getHeatmap = Store.prototype.getHeatmap;\n Store.prototype.getHeatmap = function(slide, exec) {\n return this.getSlide(slide).then(data => {\n\n var suffix = \"Heatmap/get\"\n var url = this.base + suffix;\n var query = {}\n\n data = data[0]\n if (data.field_subject_id) {\n query.subject = data.field_subject_id[0].value\n }\n if (data.field_case_id) {\n query.case = data.field_case_id[0].value\n }\n if(exec) query.exec = exec;\n\n return fetch(url + \"?\" + objToParamStr(query), {\n credentials: \"include\",\n mode: \"cors\"\n }).then(this.errorHandler).then(x=>this.filterBroken(x, \"heatmap\"))\n }).catch(function(e){\n console.error(e);\n })\n };\n\n StatesHelper.prototype.default_getCurrentStatesURL = StatesHelper.prototype.getCurrentStatesURL;\n getCurrentStatesURL = function(isImageCoordinate=false){\n let states = StatesHelper.getCurrentStates(isImageCoordinate);\n if(!states)return;\n console.log(states);\n states = StatesHelper.encodeStates(states);\n return `${location.origin}${location.pathname}?slideId=${$D.params.slideId}&states=${$D.params.states}&mode=${$D.params.mode}`\n };\n\n\n CaMic.prototype.default_loadImg = CaMic.prototype.loadImg\n CaMic.prototype.loadImg = function(func) {\n var urlParams = new URLSearchParams(window.location.search);\n var pathdb_id = urlParams.get('slideId');\n this.slideId = pathdb_id // default value\n this.slideName = pathdb_id\n this.study = \"\"\n this.specimen = \"\"\n this.subject_id = \"\"\n this.case_id = \"\"\n this.image_id = \"\"\n this.study_id = \"\"\n this.store.getSlide(pathdb_id).then(data => {\n data = data[0]\n console.log(data)\n // set mpp\n this.mpp = 1e9\n\n if (data.field_mpp_y && data.field_mpp_y.length >= 1) {\n this.mpp_y = data.field_mpp_y[0].value\n this.mpp = this.mpp_y\n }\n if (data.field_mpp_x && data.field_mpp_x.length >= 1) {\n this.mpp_x = data.field_mpp_x[0].value\n this.mpp = this.mpp_x\n }\n // identifier fields\n if(data.field_subject_id){\n this.subject_id = data.field_subject_id[0].value\n }\n if(data.field_case_id){\n this.case_id = data.field_case_id[0].value\n }\n if(data.field_image_id){\n this.image_id = data.field_image_id[0].value\n }\n if(data.field_study_id){\n this.study_id = data.field_study_id[0].value\n }\n\n if (data.field_iip_path && data.field_iip_path.length >= 1) {\n this.location = data.field_iip_path[0].value\n // MAKE URL FOR IIP\n this.url = \"../../img/IIP/raw/?DeepZoom=\" + this.location + \".dzi\"\n this.viewer.open(this.url);\n } else {\n throw \"No image location --could be token\"\n }\n\n this.viewer.mpp = this.mpp;\n this.viewer.mpp_x = this.mpp_x;\n this.viewer.mpp_y = this.mpp_y;\n\n //set scalebar\n if (this.mpp && this.mpp != 1e9) this.createScalebar(this.mpp)\n var imagingHelper = new OpenSeadragonImaging.ImagingHelper({\n viewer: this.viewer\n });\n imagingHelper.setMaxZoom(1);\n // create item to pass to the callback function, previously x[0] (slide data)\n let x = {}\n x['_id'] = this.slideId\n x.name = this.slideName\n\n // identifier field\n x.subject_id = this.subject_id\n x.case_id = this.case_id\n x.image_id = this.image_id\n x.study_id = this.study_id\n\n x.study = this.study\n x.specimen = this.specimen\n x.mpp = this.mpp;\n x.mpp_x = this.mpp_x;\n x.mpp_y = this.mpp_y;\n x.location = this.location;\n x.url = this.url;\n if (func && typeof func === 'function') {\n func.call(null, x);\n }\n Loading.text.textContent = `Loading Slide's Tiles...`;\n // we may want another init.js or our own callback\n }).catch(e => {\n console.error(e)\n Loading.text.textContent = \"ERROR - PathDB Image Error (Try A Refresh)\"\n //if(func && typeof func === 'function') func.call(null,{hasError:true,message:e});\n })\n\n }\n}\n\n\nPathDbMods()\nconsole.warn(\"This Setup Is Intended For Pathdb\")\n"]} \ No newline at end of file diff --git a/package/ImgBoxMods.js b/package/ImgBoxMods.js index 1421bd2e5..43805f3db 100644 --- a/package/ImgBoxMods.js +++ b/package/ImgBoxMods.js @@ -66,7 +66,7 @@ function ImgBoxMods() { if (func && typeof func === 'function'){ func.call(null, x); } - Loading.text.textContent = `loading slide's tiles...`; + Loading.text.textContent = `Loading Slide's Tiles...`; // WARN; note that spyglass isn't working due to semi-hardcoded value at init.js line 140 // we may want another init.js or our own callback }).catch(e=>{ diff --git a/package/pathdb_package.js b/package/pathdb_package.js index cbfcbbf9a..5f20ca3a7 100644 --- a/package/pathdb_package.js +++ b/package/pathdb_package.js @@ -24,7 +24,6 @@ function PathDbMods() { var suffix = "Mark/find" var url = this.base + suffix; var query = {} - var bySlideId if (slide) { query.slide = slide } @@ -55,11 +54,10 @@ function PathDbMods() { if (y1) { query.y1 = y1; } - let bySlide = fetch(url + "?" + objToParamStr(query), { + return fetch(url + "?" + objToParamStr(query), { credentials: "same-origin", mode: "cors" }).then(this.errorHandler).then(x => this.filterBroken(x, "mark")) - return bySlide } Store.prototype.getMarkByIds = function(ids, slide, study, specimen, source, footprint, x0, x1, y0, y1) { if (!Array.isArray(ids) || !slide) { @@ -68,7 +66,6 @@ function PathDbMods() { message: 'args are illegal' } } - var bySlideId var suffix = "Mark/multi" var url = this.base + suffix; var query = {} @@ -99,11 +96,10 @@ function PathDbMods() { if (y1) { query.y1 = y1; } - let bySlide = fetch(url + "?" + objToParamStr(query), { + return fetch(url + "?" + objToParamStr(query), { credentials: "same-origin", mode: "cors" }).then(this.errorHandler).then(x => this.filterBroken(x, "mark")) - return bySlide } Store.prototype.findMarkTypes = function(slide, name) { var suffix = "Mark/types" @@ -113,7 +109,13 @@ function PathDbMods() { console.error('Store.findMarkTypes needs slide ... '); return null; } - query.slide = slide + // pathdb numeric->str coerce + if ((parseInt(slide)==slide)||(parseFloat(slide)==slide)){ + query.slide = '"' + slide + '"' + } else { + query.slide = slide + } + if (name) { query.name = name suffix = "Mark/typesExec" @@ -122,7 +124,6 @@ function PathDbMods() { credentials: "same-origin", mode: "cors" }).then(this.errorHandler) - return bySlide } Store.prototype.default_findSlide = Store.prototype.findSlide; Store.prototype.findSlide = function(slide, specimen, study, location) { @@ -329,11 +330,11 @@ function PathDbMods() { if (func && typeof func === 'function') { func.call(null, x); } - Loading.text.textContent = `loading slide's tiles...`; + Loading.text.textContent = `Loading Slide's Tiles...`; // we may want another init.js or our own callback }).catch(e => { console.error(e) - Loading.text.textContent = "ERROR - PathDB Image Error (Try a refresh)" + Loading.text.textContent = "ERROR - PathDB Image Error (Try A Refresh)" //if(func && typeof func === 'function') func.call(null,{hasError:true,message:e}); }) @@ -342,4 +343,4 @@ function PathDbMods() { PathDbMods() -console.warn("This setup is intended for pathdb") +console.warn("This Setup Is Intended For Pathdb")