From 70ac24d354566a72d489466099e0824ce03aed4c Mon Sep 17 00:00:00 2001 From: vagisha Date: Thu, 17 Jul 2025 19:38:23 -0700 Subject: [PATCH 1/4] Migrate inline event handlers from LincsDataTable and custom GCT form. --- lincs/resources/web/lincs/lincs.js | 60 +++++++++++++++---- .../src/org/labkey/lincs/LincsDataTable.java | 33 ++++++---- .../labkey/lincs/view/downloadCustomGCT.jsp | 18 ++++-- .../webapp/PanoramaPublic/js/slideshow.js | 18 +----- 4 files changed, 87 insertions(+), 42 deletions(-) diff --git a/lincs/resources/web/lincs/lincs.js b/lincs/resources/web/lincs/lincs.js index 293f6178..ee765a99 100644 --- a/lincs/resources/web/lincs/lincs.js +++ b/lincs/resources/web/lincs/lincs.js @@ -3,23 +3,61 @@ * * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 */ -function externalHeatmapViewerLink(container, fileName, elementId, assayType) +function externalHeatmapViewerLink(fileUrl, fileName, elementId, assayType, addAnalyticsTracking) { - var fileUrl= LABKEY.ActionURL.buildURL("_webdav", "REMOVE", container + '/@files/GCT/' + fileName); - fileUrl= fileUrl.substring(0, fileUrl.indexOf("/REMOVE")); - fileUrl= LABKEY.ActionURL.getBaseURL(true) + fileUrl; - // console.log("File URL is " + fileUrl); - - var morpheusUrl = getMorpheusUrl(fileUrl, assayType); - - var analyticsEvt = " onclick=\"try {_gaq.push(['_trackEvent', 'Lincs', 'Morpheus', '" + fileName + "']);} catch (err) {} try {gtag.event('Lincs', {eventAction: 'Morpheus', fileName: '" + fileName + "'});} catch (err) {}\" "; + const morpheusUrl = getMorpheusUrl(fileUrl, assayType); Ext4.Ajax.request({ url: fileUrl, method: 'HEAD', success: function(response, opts) { - var imgUrl = LABKEY.ActionURL.getContextPath() + "/lincs/GENE-E_icon.png"; - Ext4.get(elementId).dom.innerHTML = '(View in Morpheus )'; + const imgUrl = LABKEY.ActionURL.getContextPath() + "/lincs/GENE-E_icon.png"; + + const targetElement = Ext4.get(elementId); + if (!targetElement) { + console.error('Element with Id not found:', elementId); + return; + } + + // Create link element + const link = document.createElement('a'); + link.href = morpheusUrl; + link.target = '_blank'; + link.textContent = 'View in Morpheus '; + + // Create image element + const img = document.createElement('img'); + img.src = imgUrl; + img.width = 13; + img.height = 13; + img.alt = 'GENE-E icon'; + + link.appendChild(img); + + const wrapper = document.createElement('span'); + wrapper.appendChild(document.createTextNode('[')); + wrapper.appendChild(link); + wrapper.appendChild(document.createTextNode(']')); + + targetElement.dom.appendChild(wrapper); + + if (addAnalyticsTracking) + { + // Attach the event handler + link['onclick'] = function () { + try + { + gtag('event', 'Lincs', { + eventAction: 'Morpheus', + fileName: fileName + }); + } + catch (err) + { + console.warn('Failed to track Morpheus click:', err); + } + }; + } }, failure: function(response, opts) { console.log('server-side failure with status code ' + response.status); diff --git a/lincs/src/org/labkey/lincs/LincsDataTable.java b/lincs/src/org/labkey/lincs/LincsDataTable.java index 8b07b65d..d6825cb0 100644 --- a/lincs/src/org/labkey/lincs/LincsDataTable.java +++ b/lincs/src/org/labkey/lincs/LincsDataTable.java @@ -29,6 +29,8 @@ import org.labkey.api.query.FilteredTable; import org.labkey.api.query.UserSchema; import org.labkey.api.settings.AppProps; +import org.labkey.api.util.DOM; +import org.labkey.api.util.DOM.Renderable; import org.labkey.api.util.FileUtil; import org.labkey.api.util.HtmlString; import org.labkey.api.util.LinkBuilder; @@ -45,7 +47,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import static org.labkey.api.util.DOM.Attribute.height; +import static org.labkey.api.util.DOM.Attribute.src; import static org.labkey.api.util.DOM.Attribute.style; +import static org.labkey.api.util.DOM.Attribute.width; +import static org.labkey.api.util.DOM.IMG; import static org.labkey.api.util.DOM.SPAN; import static org.labkey.api.util.DOM.at; @@ -288,28 +294,35 @@ private String getAnalyticsScript(String eventAction, String fileName, boolean a // request if the download opens on the same page. String timeout = addWaitTime ? "that=this; setTimeout(function(){location.href=that.href;},400);return false;" : ""; - // Universal Analytics - remove after conversion to GA4 is complete - String onClickScript = "try {_gaq.push(['_trackEvent', 'Lincs', " + PageFlowUtil.qh(eventAction) + ", " + PageFlowUtil.qh(fileName) + "]); } catch (err) {}"; // GA4 variant - onClickScript += "try {gtag('event', 'Lincs', {eventAction: " + PageFlowUtil.qh(eventAction) + ", fileName: " + PageFlowUtil.qh(fileName) + "}); } catch(err) {}"; + String onClickScript = "try {gtag('event', 'Lincs', {eventAction: " + PageFlowUtil.qh(eventAction) + ", fileName: " + PageFlowUtil.qh(fileName) + "}); } catch(err) {}"; onClickScript += timeout; return onClickScript; } return null; } - private HtmlString externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType) + private Renderable externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType) { String gctFileUrl = davUrl + "GCT/" + PageFlowUtil.encodePath(fileName); String morpheusUrl = getMorpheusUrl(gctFileUrl, assayType); String analyticsScript = getAnalyticsScript("Morpheus", fileName, false); - String onclickEvt = StringUtils.isBlank(analyticsScript) ? "" : "onclick=\"" + analyticsScript + "\""; String imgUrl = AppProps.getInstance().getContextPath() + "/lincs/GENE-E_icon.png"; - // TODO: Should use a LinkBuilder, etc. - return HtmlString.unsafe("[ View in Morpheus  ]"); + LinkBuilder viewInMorpheusLink = LinkBuilder.simpleLink("View in Morpheus", morpheusUrl).target("_blank"); + if (analyticsScript != null) + { + viewInMorpheusLink.onClick(analyticsScript); + } + + return DOM.SPAN("[", + HtmlString.NBSP, + viewInMorpheusLink, + IMG(at(src, imgUrl).at(width, 13).at(height, 13)), + HtmlString.NBSP, + "]"); } private String getMorpheusUrl(String gctFileUrl, LincsModule.LincsAssay assayType) @@ -365,12 +378,12 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) String actionName = (getLevel() == LincsModule.LincsLevel.Config) ? "DownloadConfig" : "DownloadGCT"; String analyticsScript = getAnalyticsScript(actionName, downloadFileName, true); - HtmlString morpheusUrl = externalHeatmapViewerLink(downloadFileName, getAssayType(), getLevel()); + Renderable morpheusUrl = externalHeatmapViewerLink(downloadFileName, getAssayType(), getLevel()); String downloadText = (getLevel() == LincsModule.LincsLevel.Config) ? "CFG" : "GCT"; renderGridCell(out, analyticsScript, getGctDavUrlUnencoded(downloadFileName), downloadText, morpheusUrl); } - private void renderGridCell(HtmlWriter out, String analyticsScript, String downloadUrl, String downloadText, HtmlString morpheusUrl) + private void renderGridCell(HtmlWriter out, String analyticsScript, String downloadUrl, String downloadText, Renderable morpheusUrl) { // is recommended instead of deprecated SPAN( @@ -408,7 +421,7 @@ private boolean fileAvailable(Integer runId, String downloadFileName) } } - @Nullable HtmlString externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType, LincsModule.LincsLevel level) + @Nullable Renderable externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType, LincsModule.LincsLevel level) { if(level == LincsModule.LincsLevel.Config) { diff --git a/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp b/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp index aedadd88..6e6b1001 100644 --- a/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp +++ b/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp @@ -26,6 +26,10 @@ <%@ page import="org.labkey.lincs.LincsController.SelectedAnnotation" %> <%@ page import="java.util.List" %> <%@ page import="java.util.stream.Collectors" %> +<%@ page import="org.labkey.api.files.FileContentService" %> +<%@ page import="java.net.URI" %> +<%@ page import="org.apache.commons.lang3.StringUtils" %> +<%@ page import="org.labkey.api.analytics.AnalyticsService" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> <%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %> @@ -35,6 +39,8 @@ public void addClientDependencies(ClientDependencies dependencies) { dependencies.add("Ext4"); + dependencies.add("/lincs/lincs.css"); + dependencies.add("/lincs/lincs.js"); } %> <% @@ -46,21 +52,21 @@ ActionURL downloadGctUrl = urlFor(DownloadCustomGCTReportAction.class); String fileName = FileUtil.getFileName(gctBean.getGctFile()); downloadGctUrl.addParameter("fileName", fileName); + + URI webDavUri = FileContentService.get().getWebDavUrl(gctBean.getGctFile(), getContainer(), FileContentService.PathType.full); + boolean hasAnalyticsTrackingScript = !StringUtils.isBlank(AnalyticsService.getTrackingScript()); %> - - -
[Download GCT] - +<%=morpheusViewerLink%>
NOTE: The file will be deleted from the server after it is downloaded.
@@ -98,4 +83,5 @@
# Replicates: <%=gctBean.getReplicateCount()%>
# Probe Annotations: <%=gctBean.getProbeAnnotationCount()%>
# Replicate Annotations: <%=gctBean.getReplicateAnnotationCount()%>
+
\ No newline at end of file From 0dbed893000c6156e993595625b86af533c60947 Mon Sep 17 00:00:00 2001 From: vagisha Date: Mon, 21 Jul 2025 12:51:46 -0700 Subject: [PATCH 3/4] Moved externalHeatmapViewerLink() back to GCTColumnPSP. --- .../src/org/labkey/lincs/LincsDataTable.java | 125 +++++++++--------- .../labkey/lincs/view/downloadCustomGCT.jsp | 4 +- 2 files changed, 64 insertions(+), 65 deletions(-) diff --git a/lincs/src/org/labkey/lincs/LincsDataTable.java b/lincs/src/org/labkey/lincs/LincsDataTable.java index 77f8fc03..aa9dfb88 100644 --- a/lincs/src/org/labkey/lincs/LincsDataTable.java +++ b/lincs/src/org/labkey/lincs/LincsDataTable.java @@ -285,8 +285,68 @@ public boolean isSortable() private HtmlString externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType) { - String gctFileUrl = getDavUrl() + "GCT/" + PageFlowUtil.encodePath(fileName); - return LincsDataTable.externalHeatmapViewerLink(fileName, assayType, gctFileUrl); + return externalHeatmapViewerLink(fileName, assayType, getGctDavUrl(fileName)); + } + + private static String getAnalyticsScript(String eventAction, String fileName, boolean addWaitTime) + { + if (!StringUtils.isBlank(AnalyticsService.getTrackingScript())) + { + // http://www.blastam.com/blog/how-to-track-downloads-in-google-analytics + // Tell the browser to wait 400ms before going to the download. This is to ensure + // that the GA tracking request goes through. Some browsers will interrupt the tracking + // request if the download opens on the same page. + String timeout = addWaitTime ? "that=this; setTimeout(function(){location.href=that.href;},400);return false;" : ""; + + // GA4 variant + String onClickScript = "try {gtag('event', 'Lincs', {eventAction: " + PageFlowUtil.qh(eventAction) + ", fileName: " + PageFlowUtil.qh(fileName) + "}); } catch(err) {}"; + onClickScript += timeout; + return onClickScript; + } + return null; + } + + public static HtmlString externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType, String gctFileDavUrl) + { + String morpheusUrl = getMorpheusUrl(gctFileDavUrl, assayType); + + String analyticsScript = getAnalyticsScript("Morpheus", fileName, false); + + String imgUrl = AppProps.getInstance().getContextPath() + "/lincs/GENE-E_icon.png"; + + LinkBuilder viewInMorpheusLink = LinkBuilder.simpleLink("View in Morpheus", morpheusUrl).target("_blank"); + if (analyticsScript != null) + { + viewInMorpheusLink.onClick(analyticsScript); + } + + return HtmlString.of(DOM.SPAN("[", + HtmlString.NBSP, + viewInMorpheusLink, + HtmlString.NBSP, + IMG(at(src, imgUrl).at(width, 13).at(height, 13)), + HtmlString.NBSP, + "]")); + } + + private static String getMorpheusUrl(String gctFileUrl, LincsModule.LincsAssay assayType) + { + String morpheusJson = "{\"dataset\":\"" + gctFileUrl + "\","; + if(assayType == LincsModule.LincsAssay.P100) + { + morpheusJson += "\"rows\":[{\"field\":\"pr_p100_modified_peptide_code\",\"display\":\"Text\"},{\"field\":\"pr_gene_symbol\",\"display\":\"Text\"},{\"field\":\"pr_p100_phosphosite\",\"display\":\"Text\"},{\"field\":\"pr_uniprot_id\",\"display\":\"Text\"}],"; + } + if(assayType == LincsModule.LincsAssay.GCP) + { + morpheusJson += "\"rows\":[{\"field\":\"pr_gcp_histone_mark\",\"display\":\"Text\"},{\"field\":\"pr_gcp_modified_peptide_code\",\"display\":\"Text\"}],"; + } + morpheusJson += "\"columns\":[{\"field\":\"pert_iname\",\"display\":\"Text\"},{\"field\":\"det_well\",\"display\":\"Text\"}],"; + morpheusJson += "\"colorScheme\":{\"type\":\"fixed\",\"map\":[{\"value\":-3,\"color\":\"blue\"},{\"value\":0,\"color\":\"white\"},{\"value\":3,\"color\":\"red\"}]}"; + morpheusJson += "}"; + + String morpheusUrl= "http://www.broadinstitute.org/cancer/software/morpheus/?json="; + morpheusUrl += PageFlowUtil.encodeURIComponent(morpheusJson); + return morpheusUrl; } @Override @@ -441,65 +501,4 @@ public Object getDisplayValue(RenderContext ctx) return getValue(ctx); } } - - private static String getAnalyticsScript(String eventAction, String fileName, boolean addWaitTime) - { - if (!StringUtils.isBlank(AnalyticsService.getTrackingScript())) - { - // http://www.blastam.com/blog/how-to-track-downloads-in-google-analytics - // Tell the browser to wait 400ms before going to the download. This is to ensure - // that the GA tracking request goes through. Some browsers will interrupt the tracking - // request if the download opens on the same page. - String timeout = addWaitTime ? "that=this; setTimeout(function(){location.href=that.href;},400);return false;" : ""; - - // GA4 variant - String onClickScript = "try {gtag('event', 'Lincs', {eventAction: " + PageFlowUtil.qh(eventAction) + ", fileName: " + PageFlowUtil.qh(fileName) + "}); } catch(err) {}"; - onClickScript += timeout; - return onClickScript; - } - return null; - } - - public static HtmlString externalHeatmapViewerLink(String fileName, LincsModule.LincsAssay assayType, String gctFileDavUrl) - { - String morpheusUrl = getMorpheusUrl(gctFileDavUrl, assayType); - - String analyticsScript = getAnalyticsScript("Morpheus", fileName, false); - - String imgUrl = AppProps.getInstance().getContextPath() + "/lincs/GENE-E_icon.png"; - - LinkBuilder viewInMorpheusLink = LinkBuilder.simpleLink("View in Morpheus", morpheusUrl).target("_blank"); - if (analyticsScript != null) - { - viewInMorpheusLink.onClick(analyticsScript); - } - - return HtmlString.of(DOM.SPAN("[", - HtmlString.NBSP, - viewInMorpheusLink, - HtmlString.NBSP, - IMG(at(src, imgUrl).at(width, 13).at(height, 13)), - HtmlString.NBSP, - "]")); - } - - private static String getMorpheusUrl(String gctFileUrl, LincsModule.LincsAssay assayType) - { - String morpheusJson = "{\"dataset\":\"" + gctFileUrl + "\","; - if(assayType == LincsModule.LincsAssay.P100) - { - morpheusJson += "\"rows\":[{\"field\":\"pr_p100_modified_peptide_code\",\"display\":\"Text\"},{\"field\":\"pr_gene_symbol\",\"display\":\"Text\"},{\"field\":\"pr_p100_phosphosite\",\"display\":\"Text\"},{\"field\":\"pr_uniprot_id\",\"display\":\"Text\"}],"; - } - if(assayType == LincsModule.LincsAssay.GCP) - { - morpheusJson += "\"rows\":[{\"field\":\"pr_gcp_histone_mark\",\"display\":\"Text\"},{\"field\":\"pr_gcp_modified_peptide_code\",\"display\":\"Text\"}],"; - } - morpheusJson += "\"columns\":[{\"field\":\"pert_iname\",\"display\":\"Text\"},{\"field\":\"det_well\",\"display\":\"Text\"}],"; - morpheusJson += "\"colorScheme\":{\"type\":\"fixed\",\"map\":[{\"value\":-3,\"color\":\"blue\"},{\"value\":0,\"color\":\"white\"},{\"value\":3,\"color\":\"red\"}]}"; - morpheusJson += "}"; - - String morpheusUrl= "http://www.broadinstitute.org/cancer/software/morpheus/?json="; - morpheusUrl += PageFlowUtil.encodeURIComponent(morpheusJson); - return morpheusUrl; - } } diff --git a/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp b/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp index b90314f3..e0198cc2 100644 --- a/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp +++ b/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp @@ -28,10 +28,10 @@ <%@ page import="java.util.stream.Collectors" %> <%@ page import="org.labkey.api.files.FileContentService" %> <%@ page import="java.net.URI" %> -<%@ page import="org.labkey.lincs.LincsDataTable" %> <%@ page import="org.labkey.lincs.LincsController" %> <%@ page import="org.labkey.lincs.LincsModule.LincsAssay" %> <%@ page import="org.labkey.api.util.HtmlString" %> +<%@ page import="org.labkey.lincs.LincsDataTable.GctColumnPSP" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> <%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %> @@ -56,7 +56,7 @@ URI webDavUri = FileContentService.get().getWebDavUrl(gctBean.getGctFile(), getContainer(), FileContentService.PathType.full); LincsAssay assayType = LincsController.getLincsAssayType(getContainer()); - HtmlString morpheusViewerLink = LincsDataTable.externalHeatmapViewerLink(fileName, assayType, webDavUri.toString()); + HtmlString morpheusViewerLink = GctColumnPSP.externalHeatmapViewerLink(fileName, assayType, webDavUri.toString()); %>
From 4b0c8412b7acead076800779eeacc891684ea889 Mon Sep 17 00:00:00 2001 From: vagisha Date: Mon, 21 Jul 2025 13:28:00 -0700 Subject: [PATCH 4/4] Removed Ext4 dependency --- lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp | 1 - 1 file changed, 1 deletion(-) diff --git a/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp b/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp index e0198cc2..357f93e1 100644 --- a/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp +++ b/lincs/src/org/labkey/lincs/view/downloadCustomGCT.jsp @@ -40,7 +40,6 @@ @Override public void addClientDependencies(ClientDependencies dependencies) { - dependencies.add("Ext4"); dependencies.add("/lincs/lincs.css"); } %>